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

Eval() versus Function() for evaluating string expressions in JavaScript: Not the same behavior

我有以下字符串表达式:

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("return " + string_expression)();

...我收到以下错误:

Uncaught SyntaxError: Unexpected token 'var'

为什么这会有不同的表现?出于安全原因,我正在寻找 eval() 的替代方法,并认为 Function 方法对字符串表达式同样有效。 eval() 是否有更好的替代方法,在解析字符串表达式方面效果相同?

因为你给他们喂了不同的东西。 return var sum = 0 是语法错误。对于类似的行为,省略 return。您的字符串表达式 alerts 而不是 returning 值:

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)()

如果你想让它成为return的值,你就得修改字符串;在这里,我将 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);