【问题标题】:Eval() versus Function() for evaluating string expressions in JavaScript: Not the same behavior在 JavaScript 中评估字符串表达式的 Eval() 与 Function():不同的行为
【发布时间】:2021-10-23 06:02:17
【问题描述】:

我有以下字符串表达式:

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" 连接到string_expression 时,它变成了"return var sum = 0;"...,这是无效的JS。
  • string_expression 的末尾,将alert(sum) 更改为return sum,并且不要将任何内容连接到string_expression 的开头。

标签: javascript function security scripting eval


【解决方案1】:

因为你给它们注入了不同的东西。 return var sum = 0 是语法错误。对于类似的行为,请忽略 return。你的字符串表达式alerts 而不是返回一个值:

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

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2023-04-11
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多