var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);
评估是邪恶的 http://web.archive.org/web/20160606132040/http://jslinterrors.com:80/eval-is-evil/
我一直在互联网上阅读有关 eval() 函数的内容,但除了“之外,无法真正掌握它的实际用途”它评估一个表达式".
我们应该只对数值使用 eval() 函数吗?
eval()
获取给定的字符串,并像纯 JavaScript 代码一样运行它。
它被认为是“邪恶的”,因为:
它使事情变得过于复杂 -大多数情况下eval()
使用时,会有一个不需要它的更简单的解决方案。问题中的这个例子是一个完美的例子:绝对不需要eval()
对于这样的表达。 JS 具有完美的语法,可以将对象属性名称作为字符串引用(myObject["x"]
是相同的myObject.x
).
调试起来要困难得多 -在调试器中使用它会更困难,即使您已经设法弄清楚发生了什么,您仍然需要做额外的工作,因为您必须调试评估的代码和生成原始字符串的代码进行评估。
它会减慢速度 -脚本编译器无法预编译代码eval()
,因为在到达那里之前它不知道代码将包含什么。所以你会失去现代 Javascript 引擎的一些性能优势。
这是黑客的梦想—— eval()
将字符串作为代码运行。黑客喜欢这个,因为将字符串注入程序比注入代码容易得多;但eval()
意味着您可以注入一个字符串,并让它作为代码运行。所以eval()
使您的代码更容易被黑客攻击。 (与其他语言相比,对于基于浏览器的 Javascript 来说,这不是一个问题,因为 JS 代码无论如何都可以在浏览器中访问,因此您的安全模型不应基于代码不可变,但尽管如此,注入黑客仍然可能是一个问题,特别是跨站点攻击)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)