eval做了什么以及为什么它的邪恶?

时间:2013-08-16 09:12:11

标签: javascript eval

var myString = "x",
    myObject = {
        x: 10
    },
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);

http://jslinterrors.com/eval-is-evil/

我一直在网上阅读关于eval()函数的内容,但除了“它评估一个表达式”之外,它无法真正理解它的实际功能。

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

2 个答案:

答案 0 :(得分:14)

eval()获取给定的字符串,并将其作为纯JavaScript代码运行。

它被认为是“邪恶的”,因为:

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

  • 调试起来要困难得多 - 在调试器中使用它很难,甚至一旦你设法解决了正在发生的事情,你就有额外的工作要做,因为你必须调试eval'd代码和生成原始字符串的代码到eval。

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

  • 这是黑客的梦想 - eval()运行字符串作为代码。黑客喜欢这个,因为将一个字符串注入程序要比注入代码要容易得多;但eval()表示您可以注入一个字符串,并让它作为代码运行。因此eval()使您的代码更容易入侵。 (对于基于浏览器的Javascript而言,这比其他语言更少,因为无论如何都可以在浏览器中访问JS代码,因此您的安全模型不应该基于您的代码是不可变的,但是,注入黑客仍然可能是一个问题,尤其是跨站点攻击)。

答案 1 :(得分:6)

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

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