2010-10-15 111 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的最好办法

相关问题