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

评估是邪恶的

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

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

4

2 回答 2

14

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

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

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

  • 调试起来要困难得多——在调试器中使用它更难,即使你已经设法弄清楚发生了什么,你还有额外的工作要做,因为你必须调试 eval 的代码和生成原始字符串以进行 eval 的代码。

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

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

于 2013-08-16T09:18:40.773 回答
6

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

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

于 2013-08-16T09:15:03.693 回答