var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);
http://jslinterrors.com/eval-is-evil/
我一直在网上阅读关于eval()函数的内容,但除了“它评估一个表达式”之外,它无法真正理解它的实际功能。
我们应该只为数值使用eval()函数吗?
答案 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。