埃瓦尔做了什么,为什么它是邪恶的

what does eval do and why its evil?

本文关键字:邪恶 为什么 什么 埃瓦尔      更新时间:2023-09-26
var myString = "x",
    myObject = {
        x: 10
    },
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);

埃瓦尔是邪恶的

我一直在互联网上阅读有关 eval(( 函数的信息,但除了"它评估表达式"之外,无法真正掌握它的实际作用。

我们应该只对数值使用 eval(( 函数吗?

eval()获取给定的字符串,并像运行纯JavaScript代码一样运行它。

它被认为是"邪恶的",因为:

  • 它使事情过于复杂 - 大多数情况下使用eval(),会有一个更简单的解决方案不需要它。问题中的这个例子就是一个很好的例子:这样的表达式绝对不需要eval()。JS具有非常好的语法,可以将对象属性名称引用为字符串(myObject["x"]myObject.x相同(。

  • 调试要困难得多 - 在调试器中使用它更难,即使你设法弄清楚发生了什么,你也有额外的工作要做,因为你必须调试 eval'd 代码和生成原始字符串的代码。

  • 它减慢了速度 - 脚本编译器无法在eval()中预编译代码,因为它不知道代码将包含什么,直到它到达那里。因此,您将失去现代Javascript引擎中的一些性能优势。

  • 这是黑客的梦想 - eval()运行字符串作为代码。黑客喜欢这个,因为将字符串注入程序比注入代码容易得多;但eval()意味着您可以注入一个字符串,并让它作为代码运行。因此,eval()使您的代码更容易被破解。(与其他语言相比,对于基于浏览器的Javascript来说,这不是一个问题,因为JS代码无论如何都可以在浏览器中访问,所以你的安全模型不应该基于你的代码是不可变的,但是,注入黑客仍然是一个问题,特别是跨站点攻击(。

在这种情况下,只需使用 myObject[myString] .

eval被可怕的滥用。我发现它的唯一有效用途是在旧浏览器中解析 JSON。