var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);
我在网上读到了关于eval()函数的信息,但除了"它评估表达式"之外,我实际上并没有真正理解它的作用。
我们应该只针对数值使用eval()函数吗?
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()
后的代码。
它会减慢运行速度 - 脚本编译器无法预编译eval()
中的代码,因为它不知道代码包含什么直到执行时才能确定。因此,现代Javascript引擎的一些性能优势将不再存在。
它是黑客的梦想 - eval()
将一个字符串作为代码运行。黑客喜欢这个功能,因为将字符串注入到程序中比注入代码容易得多;但是,eval()
意味着你可以将一个字符串注入到程序中,并让它作为代码运行。因此,eval()
使您的代码更容易被黑客攻击。(对于基于浏览器的JavaScript来说,这不是那么大的问题,因为JS代码在浏览器中是可访问的,所以您的安全模型不应该基于您的代码不可变,但是注入攻击仍然可能成为一个问题,特别是跨站点攻击)。
myObject[myString]
。
eval
的使用非常不当。我发现它几乎唯一有效的用途是在较旧的浏览器中解析JSON。