【问题标题】:How can I use js eval to return a value?如何使用 js eval 来返回值?
【发布时间】:2019-06-27 19:01:48
【问题描述】:

我需要评估从服务器作为字符串传递的自定义函数。这都是我得到的复杂 json 的一部分,但无论如何,我似乎需要一些类似的东西:

var customJSfromServer = "return 2+2+2;"
var evalValue = eval(customJSfromServer);
alert(evalValue) ;// should be "6";

显然这并没有像我预期的那样工作。有什么办法可以做到这一点?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    第一种方法是删除return关键字和分号:

    var expression = '2+2+2';
    var result = eval('(' + expression + ')')
    alert(result);
    

    注意 '('')' 是必须的。

    或者你可以把它变成一个函数:

    var expression = 'return 2+2+2;'
    var result = eval('(function() {' + expression + '}())');
    alert(result);
    

    更简单,不要使用eval:

    var expression = 'return 2+2+2;';
    var result = new Function(expression)();
    alert(result);
    

    【讨论】:

    • 谢谢。在您的第二个示例中,如果表达式的最后一行有注释,eval('(function() {' + expression + '}())'); 将失败,并出现 unexpected end of input 之类的错误。要修复它,请在末尾添加一个换行符:'\n}())'
    • 感谢您的解决方案,我使用了第二个示例,最后有一个新行 '\n}())',它工作正常。
    【解决方案2】:

    如果您可以保证return 语句将始终存在,您可能会发现以下更合适:

    var customJSfromServer = "return 2+2+2;"
    var asFunc = new Function(customJSfromServer);
    alert(asFunc()) ;// should be "6";
    

    当然,你也可以这样做:

    var customJSfromServer = "return 2+2+2;"
    var evalValue = (new Function(customJSfromServer)());
    alert(evalValue) ;// should be "6";
    

    【讨论】:

      【解决方案3】:
      var customJSfromServer = "2+2+2;"
      var evalValue = eval(customJSfromServer);
      alert(evalValue) ;// should be "6";
      

      【讨论】:

        【解决方案4】:

        不应该有return语句,因为eval会把这个当作语句读取,不会返回值。

        var customJSfromServer = "2+2+2;"
        var evalValue = eval( customJSfromServer );
        alert(evalValue) ;// should be "6";
        

        http://www.w3schools.com/jsref/jsref_eval.asp

        【讨论】:

        • 如果您在字符串之外声明evalValue,这可能也有效。
        【解决方案5】:

        这行得通:

        function answer() {
            return 42;
        }
        
        var a = eval('answer()');
        console.log(a);
        

        您需要将 return 包装在一个函数中,它应该从 eval 传递值。

        【讨论】:

          【解决方案6】:

          修改服务器响应以获取“2+2+2”(删除“return”)并尝试以下操作:

          var myvar = eval(response);
          alert(myvar);
          

          【讨论】:

            【解决方案7】:

            2019 年使用模板文字:

            var customJSfromServer = "2+2+2;"
            var evalValue = eval(`${customJSfromServer}`);
            alert(evalValue) ;// should be "6";
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多