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'd 代码和生成要评估的原始字符串的代码。
它会减慢速度 -脚本编译器无法在 . 中预编译代码eval()
,因为它在到达那里之前不知道代码将包含什么。所以你失去了现代 Javascript 引擎的一些性能优势。
这是黑客的梦想—— eval()
将字符串作为代码运行。黑客喜欢这个,因为将字符串注入程序比注入代码容易得多;但eval()
意味着你可以注入一个字符串,并让它作为代码运行。所以eval()
让你的代码更容易被破解。(对于基于浏览器的 Javascript 而言,这不是其他语言的问题,因为无论如何都可以在浏览器中访问 JS 代码,因此您的安全模型不应基于您的代码是不可变的,但是,注入黑客仍然是一个问题,尤其是跨站点攻击)。
在这种情况下,只需使用myObject[myString]
.
eval
被严重滥用。我发现它的唯一有效用途几乎是在旧浏览器中解析 JSON。