2010-10-15 76 views
25

有什麼辦法可以將函數作爲json字符串傳遞(使用JSON.stringify進行轉換),將它發送給另一個函數,解析json然後執行json中的函數?我正在使用jQuery和JavaScript。在json中傳遞函數並執行

回答

19

這裏的工作example

基本上,你必須要小心這樣的事情。如果您使用現有的JavaScript函數,將其轉換爲字符串並對其進行評估,則可能會遇到函數重新聲明問題。如果你簡單地把從服務器的函數字符串,要運行它,你可以做我做對的jsfiddle:

的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

酷 - 感謝這 – amateur 2010-10-16 14:07:39

-7

不,你不能這樣做。函數不能被JSON序列化。不用將對象轉換爲JSON,您可以直接將它傳遞給另一個函數,而無需調用JSON.stringify。

+0

我有一種感覺,他的穿越線somewheres ... – jcolebrand 2010-10-16 00:09:29

+19

JSON = JavaScript對象符號 - 當然,該函數可以被序列化並且來回傳遞。什麼是對象?幾乎所有的JS,包括的功能。當「是」是正確的答案時,當有人說「不」時有點惱火。不如說「不是我知道的」。 Bill – 2011-03-09 10:48:36

+0

在我說smt在JavaScript中是不可能的之前,我想了十遍:)幾乎沒有人會記得JS本身的幾個「NO」。 「如何」和「爲什麼不是」是最常見的問題。 – 2014-06-15 16:42:05

19

是的,你可以使用它的toString()方法將函數轉換爲字符串。

Here's an example顯示功能轉換爲字符串,並返回一個函數:

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

這種編程方法真的打開你的想法。 – zardilior 2015-07-07 19:26:27

47

是的,可以。有很多方法可以做到這一點。

而且也沒有必要用「邪惡」的eval函數(請yahoogle爲什麼應該避免)這裏指出:http://javascript.about.com/library/bleval.htm

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

無論是JSON在任何階段應該是無關的。

+8

+1「yahoogle」。雖然Bing現在不比雅虎更受歡迎?那會是「單調」嗎?或者Scott Hanselman在演講中使用的較長的詞組「Google上的Bing」? – GregL 2012-03-09 01:53:49

+0

我同意@GregL,但我前段時間創造了這個短語,只是不想放過它!使用「bingle」,「bingoogle」......對我來說聽起來不太合適。此外,英語中有很多詞彙和諺語是指過時的東西...... – EasierSaidThanDone 2012-03-11 21:37:05

+2

YabingleYabingleGo – Automatico 2014-06-02 14:00:10

3

我創建JSONfn的一個分支,它使您能夠字符串化和分析的對象和他們的原型。在我的基本測試中,它運行良好。

https://github.com/cgarciae/jsonfn

-2

//添加jQuery庫

點擊我

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

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

這是我想傳遞函數JSON的最好辦法