【问题标题】:pass function in json and execute在json中传递函数并执行
【发布时间】:2010-10-15 23:57:21
【问题描述】:

有什么方法可以将函数作为 json 字符串传递(使用 JSON.stringify 转换),将其发送到另一个函数,解析 json,然后执行 json 中的函数?我正在使用 jquery 和 javascript。

【问题讨论】:

    标签: javascript jquery json observer-pattern


    【解决方案1】:

    是的,你可以。有很多方法可以做到这一点。

    并且没有必要使用这里指出的“邪恶” eval 函数(请 yahoogle 为什么应该避免它):http://javascript.about.com/library/bleval.htm

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

    在任何阶段是否是 JSON 都应该是无关紧要的。

    【讨论】:

    • “雅虎”+1。虽然现在 Bing 不是比雅虎更受欢迎吗?那会是“短发”吗?还是 Scott Hanselman 在“Google it on Bing”演示文稿中使用的更长的短语?
    • 我同意@GregL,但我前段时间创造了这句话,只是不想放手!使用“bingle”、“bingoogle”……对我来说听起来不太对劲。此外,英语中有很多词语和谚语指代过时的事物......
    • 不错@webnoob,但现在改变为时已晚,“雅虎”已经病毒式传播
    • 我会做到的! :)
    • 非常好!非常感谢!
    【解决方案2】:

    是的,您可以使用 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();
    

    【讨论】:

    • 为什么在 eval 中多了一组 ( )?
    【解决方案3】:

    这是一个有效的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();
    });​
    

    【讨论】:

      【解决方案4】:

      看看 JSONfn 插件。

      http://www.eslinstructor.net/jsonfn/

      它完全符合您的要求。

      -瓦迪姆

      【讨论】:

        【解决方案5】:

        我创建了 JSONfn 的一个分支,它使您能够对对象及其原型进行字符串化和解析。在我的基本测试中,它运行良好。

        https://github.com/cgarciae/jsonfn

        【讨论】:

          【解决方案6】:

          我发现在处理 JSON 文件中的函数时使用 JavaScript call() 函数很有帮助。

          var returnData = theJsonData.theFunction.call();
          console.log(returnData); // prints any return data
          

          希望对路过的人有所帮助!

          【讨论】:

            【解决方案7】:

            不,你不能这样做。函数不能被 JSON 序列化。无需将对象转换为 JSON,您可以直接将其传递给其他函数,而无需调用 JSON.stringify。

            【讨论】:

            • JSON = JavaScript Object Notation - 当然该函数可以被序列化并来回传递。什么是对象? JS 中的几乎所有东西,包括函数。当“是”是正确答案时,当有人说“不”时会有点生气。最好说“我不知道”。比尔
            • 我想十次才说 smt 在 JavaScript 中是不可能的 :) 甚至连 JS 本身中的几个“NO”都想不起来。 “如何”和“为什么不”是最常见的问题。
            • @ArmanMcHitarian 您忘记了第三个最常见的问题:“为什么它会这样做!?”
            • 正如其他人指出的那样,这是可以做到的。
            猜你喜欢
            • 2021-10-14
            • 2015-06-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多