2009-08-13 43 views
16

Tôi có chức năng và nội dung của nó dưới dạng chuỗi.thực hiện các chức năng ẩn danh được tạo bằng cách sử dụng JavaScript eval()

var funcStr = "function() { alert('hello'); }"; 

Bây giờ, tôi thực hiện eval() để thực sự nhận hàm đó trong một biến.

var func = eval(funcStr); 

Nếu tôi nhớ không lầm thì trong Chrome và Opera, chỉ cần gọi

func(); 

gọi hàm và cảnh báo được hiển thị.

Nhưng, trong các trình duyệt khác thì không phải như vậy. không có chuyện gì xảy ra.

Tôi không muốn tranh luận về phương pháp nào là đúng, nhưng làm cách nào tôi có thể thực hiện việc này? Tôi muốn có thể gọi biến(); để thực thi hàm được lưu trữ trong biến đó.

+0

Tôi tự hỏi tại sao bạn cần một hàm ẩn danh được biểu diễn dưới dạng chuỗi ký tự, ngược với việc chỉ đơn giản là có hàm được đặt tên? –

+0

FYI: Tôi đang xác định tập lệnh của riêng mình cho ứng dụng web của mình. Tôi đang viết một thông dịch viên và cần phải xây dựng các hàm JS ngay lập tức và sau đó tạo ra các hàm thực thi thực tế từ chúng. –

+0

Tại sao bạn không viết thông dịch viên theo cách truyền thống? – Breton

Trả lời

30

Làm thế nào về điều này?

var func = new Function('alert("hello");'); 

Để thêm tham số cho hàm:

var func = new Function('what', 'alert("hello " + what);'); 
func('world'); // hello world 

Do lưu ý rằng chức năng là các đối tượng và có thể được gán cho bất kỳ biến vì họ là:

var func = function() { alert('hello'); }; 
var otherFunc = func; 
func = 'funky!'; 

function executeSomething(something) { 
    something(); 
} 
executeSomething(otherFunc); // Alerts 'hello' 
+0

Đây là cả một cách thanh lịch để làm điều đó, và hoạt động trong tất cả các trình duyệt. Cảm ơn :) –

6

Hãy thử

var funcStr = "var func = function() { alert('hello'); }"; 

eval(funcStr); 

func(); 
+0

hey, Cảm ơn đã làm việc! Nhưng có vẻ hơi lạ khi làm theo cách đó: D. –

4

Sử dụng eval như thế này:

var func = eval('(' + funcStr + ')'); 
+0

Đó là những gì tôi nghĩ ban đầu, nhưng tôi khá chắc chắn rằng chỉ áp dụng cho các đối tượng. – karim79

+0

Ngoài ra, cho dù đó là cách đúng hay sai ... nó cũng không hoạt động trong IE. –

+0

Chức năng cũng là các đối tượng. Nó hoạt động với dấu ngoặc đơn. – Blixt

13

IE không thể eval chức năng (Có lẽ vì lý do bảo mật).

Cách giải quyết tốt nhất là đặt các chức năng trong một mảng, như thế này:

var func = eval('[' + funcStr + ']')[0]; 
+1

Heh ... Sneaky lén lút! – Blixt

+0

Có thể. Tuy nhiên, hàm theo nghĩa đen không phải là câu lệnh, vì vậy chúng cần dấu ngoặc đơn xung quanh chúng, nó sạch hơn giải pháp mảng của bạn –

+1

@Juan: Sai; nó không thể. Hãy thử 'javascript: alert (eval ('(function() {return 3;})')); ' – SLaks

0

gì cũng làm việc là

var myFunc = function(myParam){ 
    // function body here 
} 
7

Tôi nhận ra điều này là cũ, nhưng nó là kết quả chỉ có giá trị sắp tới trong các tìm kiếm google của tôi để đánh giá chuỗi chức năng javascript ẩn danh.

Cuối cùng tôi đã tìm ra cách để làm điều đó từ một bài đăng trên nhóm google jquery.

eval("false||"+data) 

nơi dữ liệu là chuỗi chức năng của bạn như "function() {return 123;}"

Cho đến nay, tôi đã chỉ cố gắng này trong IE8 và FF8 (các trình duyệt trên máy tính cá nhân của tôi), nhưng Tôi tin rằng jquery sử dụng nội bộ này nên nó chỉ hoạt động ở mọi nơi.

+0

Tôi không hiểu tại sao mọi người khác dường như không có vấn đề này. Đây là vàng, cảm ơn! – Shwouchk

0

EVAL không có eval() ...

function evalEx(code){ 
    var result,D=document,S=D.createElement('script'), 
    H=D.head||D.getElementsByTagName['head'][0], 
    param=Array.prototype.slice.call(arguments); 
    code='function evalWE(){'+code+'}'; 
    S.innerText===''?S.innerText=code:S.textContent=code; 
    H.appendChild(S); 
    result=evalWE.apply(this,param); 
    H.removeChild(S); 
    return result 
} 

Cách sử dụng Ví dụ:

ABC=evalEx('return "ABC"'); 
nine=evalEx('return arguments[1]+arguments[2]',4,5); 
+0

haha, bạn vừa cho tôi lý do tại sao Google Packaged Apps không cho phép javascript nội tuyến trong HTML: http://developer.chrome.com/extensions/contentSecurityPolicy.html – nraynaud

0

Một ví dụ đơn giản về việc xác định một chức năng như là một chuỗi, eval() ing nó, và đi qua trong một tham số trong khi ngay lập tức gọi chức năng (và sau đó bán phá giá các kết quả vào console):

console.log('eval: %s', eval("(function(foo) { return foo.bar; })")({"bar": "12345"}));

Điều này tạo ra kết quả như sau.

eval: 12345

3

Chúng tôi giải quyết vấn đề này bằng cách chuẩn bị phổ cập chức năng phân tích cú pháp chuyển đổi chuỗi để thực hàm JavaScript:

if (typeof String.prototype.parseFunction != 'function') { 
    String.prototype.parseFunction = function() { 
     var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi; 
     var match = funcReg.exec(this.replace(/\n/g, ' ')); 

     if(match) { 
      return new Function(match[1].split(','), match[2]); 
     } 

     return null; 
    }; 
} 

ví dụ về việc sử dụng:

var func = 'function (a, b) { return a + b; }'.parseFunction(); 
alert(func(3,4)); 

func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction(); 
func(); 

here là jsfiddle

Các vấn đề liên quan