2010-10-15 29 views
25

Có cách nào để tôi có thể chuyển một hàm như là một chuỗi json (chuyển đổi với JSON.stringify) hay không, gửi nó đến hàm khác, phân tích cú pháp và sau đó thực thi hàm trong json ? Tôi đang sử dụng jquery và javascript.chức năng vượt qua trong json và thực hiện

Trả lời

19

Dưới đây là một công tác example

Về cơ bản, bạn phải cẩn thận với các loại điều này. Nếu bạn lấy một hàm javascript mở rộng, biến nó thành một chuỗi và đánh giá nó, bạn có thể gặp phải các vấn đề về chức năng redeclaration. Nếu bạn chỉ đơn giản là tham gia một chuỗi chức năng từ máy chủ và bạn muốn chạy nó, bạn có thể làm như tôi đã làm trên jsfiddle rằng:

Javascript

var myFunc = "function test() {alert('test');}"; 

$(document).ready(function() { 
    var data = new Object(); 
    data.func = myFunc; 
    var jsonVal = $.toJSON(data); 
    var newObj = $.evalJSON(jsonVal); 
    eval(newObj.func); 
    test(); 
});​ 
+0

tuyệt vời - cảm ơn vì điều này – amateur

-7

Không, bạn không thể thực hiện việc này. Các hàm không thể được tuần tự hóa JSON. Thay vì chuyển đổi đối tượng thành JSON, bạn có thể truyền trực tiếp nó sang hàm khác mà không cần gọi JSON.stringify.

+0

Tôi có một cảm giác anh ấy đi qua một sợi dây somewheres ... – jcolebrand

+19

JSON = Ký hiệu đối tượng JavaScript - tất nhiên chức năng có thể được tuần tự hóa và chuyển tới và fro. Một đối tượng là gì? Khá nhiều thứ trong JS, bao gồm các chức năng. Có một chút khó chịu khi ai đó nói "Không" khi "CÓ" là câu trả lời đúng. Tốt hơn để nói 'không phải là tôi biết'. Bill –

+0

Tôi nghĩ rằng mười lần trước khi nói rằng smt là không thể trong JavaScript :) Khó có thể nhớ lại ngay cả một vài "KHÔNG" trong JS mỗi se. "CÁCH" và "TẠI SAO KHÔNG" là những câu hỏi phổ biến nhất. –

19

Có, bạn có thể chuyển đổi hàm thành chuỗi có phương thức toString().

Here's an example để hiển thị chuyển đổi một chức năng để một chuỗi và trở lại một chức năng:

var myfunc = function() { 
    alert('It works!'); 
} 

var as_string = myfunc.toString(); 

as_string = as_string.replace('It works', 'It really works'); 

var as_func = eval('(' + as_string + ')'); 

as_func(); 
+0

Cách tiếp cận lập trình này thực sự mở ra cho bạn. – zardilior

47

Vâng, bạn có thể. Có rất nhiều cách để làm điều đó.

Và không có nhu cầu sử dụng các "ác" chức năng eval (xin yahoogle tại sao nó nên tránh) như đã chỉ ra ở đây: http://javascript.about.com/library/bleval.htm

var tmpFunc = new Function(codeToRun); 
tmpFunc(); 

Cho dù đó là JSON ở bất kỳ giai đoạn nên không thích hợp.

+8

+1 cho "yahoogle". Mặc dù không phải là Bing phổ biến hơn Yahoo những ngày này? Đó có phải là "bingle" không? Hoặc cụm từ dài hơn Scott Hanselman đã sử dụng trong các bản trình bày "Google trên Bing"? – GregL

+0

Tôi đồng ý @GregL, nhưng tôi đã đặt ra cụm từ này một thời gian trước đây và không muốn để nó đi! Sử dụng "bingle", "bingoogle" ... không có vẻ phù hợp với tôi. Plus có rất nhiều từ và tục ngữ trong ngôn ngữ tiếng Anh đề cập đến những điều đã lỗi thời ... – EasierSaidThanDone

+2

YabingleYabingleGo – Automatico

3

Tôi tạo ra một ngã ba của JSONfn cho phép bạn stringify và phân tích đối tượng và nguyên mẫu của họ. Trong các thử nghiệm cơ bản của tôi nó hoạt động tốt.

https://github.com/cgarciae/jsonfn

-2

// Thêm jquery thư viện

Click me

var jsonFun = { 
    fun1 : function(){ 
    alert('Done'); 
    } 
} 

$('button').click(function(){ 
    jsonFun.fun1(); 
}); 

Đây là tôi đoán là cách tốt nhất để vượt qua chức năng trong JSON

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