代码之家  ›  专栏  ›  技术社区  ›  Cybernetic

在JavaScript中评估字符串表达式的Eval()与Function():行为不同

  •  -2
  • Cybernetic  · 技术社区  · 3 年前

    我有以下字符串表达式:

    string_expression = "var sum = 0;\nfor (var i = 0; i < 100; i++) {\n    var index = i + 1;\n    sum += (index / ((index * Math.sqrt(index + 1)) + ((index + 1) * Math.sqrt(index))))\n}\nalert(sum)
    

    如果我使用eval(),效果很好:

    eval(string_expression)
    

    但如果我使用Function,如下所示:

    Function("return " + string_expression)();
    

    ….我得到以下错误:

    Uncaught SyntaxError: Unexpected token 'var'

    为什么这会有不同的表现?我正在寻找替代方案 eval() 出于安全原因,并认为 Function 方法对字符串表达式的作用也是一样的。有更好的替代方案吗 eval() 就能够解析字符串表达式而言,它的工作原理是一样的?

    1 回复  |  直到 3 年前
        1
  •  2
  •   T.J. Crowder    3 年前

    因为你在给他们灌输不同的东西。 return var sum = 0 是一个语法错误。对于类似的行为,请忽略 return 。您的字符串表达式 alert s而不是返回一个值:

    var string_expression = "var sum = 0;\nfor (var i = 0; i < 100; i++) {\n    var index = i + 1;\n    sum += (index / ((index * Math.sqrt(index + 1)) + ((index + 1) * Math.sqrt(index))))\n}\nalert(sum)";
    
    Function(string_expression)()

    如果你想 回来 值,则必须修改字符串;这里我变了 alert(sum) return sum :

    var string_expression = "var sum = 0;\nfor (var i = 0; i < 100; i++) {\n    var index = i + 1;\n    sum += (index / ((index * Math.sqrt(index + 1)) + ((index + 1) * Math.sqrt(index))))\n}\nreturn sum;";
    
    const sum = Function(string_expression)();
    alert(sum);