Javascript eval做什么?为什么它是邪恶的?
我一直在网上阅读eval()函数,但除了“它对表达式求值””之外,我无法真正理解它的实际功能Javascript eval做什么?为什么它是邪恶的?,javascript,eval,Javascript,Eval,我一直在网上阅读eval()函数,但除了“它对表达式求值””之外,我无法真正理解它的实际功能 我们应该只对数值使用eval()函数吗 在这种情况下,只需使用myObject[myString] eval被严重滥用。我发现它的唯一有效用途就是在旧浏览器中解析JSON。eval()获取给定的字符串,并像运行普通JavaScript代码一样运行它 它被认为是“邪恶的”,因为: 它使事情变得过于复杂-在使用eval()的大多数情况下,会有一个更简单的解决方案,而不需要它。问题中的这个例子就是一个很好的
我们应该只对数值使用eval()函数吗 在这种情况下,只需使用
myObject[myString]
eval
被严重滥用。我发现它的唯一有效用途就是在旧浏览器中解析JSON。eval()
获取给定的字符串,并像运行普通JavaScript代码一样运行它
它被认为是“邪恶的”,因为:
- 它使事情变得过于复杂-在使用
的大多数情况下,会有一个更简单的解决方案,而不需要它。问题中的这个例子就是一个很好的例子:对于这样的表达式,绝对不需要eval()
。JS具有非常好的语法,可以将对象属性名称作为字符串引用(eval()
与myObject[“x”]
相同)myObject.x
- 调试要困难得多-在调试器中使用它要困难得多,即使您已经设法弄清楚发生了什么,您仍有额外的工作要做,因为您必须同时调试eval代码和生成要eval的原始字符串的代码
- 它会减慢速度-脚本编译器无法在
中预编译代码,因为它在到达那里之前不知道代码将包含什么。因此,您失去了现代Javascript引擎的一些性能优势eval()
- 这是黑客的梦想-
以代码的形式运行字符串。黑客喜欢这样做,因为向程序中注入字符串比注入代码容易得多;但是eval()
意味着您可以插入一个字符串,并让它作为代码运行。因此eval()
使您的代码更容易被破解。(与其他语言相比,这对于基于浏览器的Javascript来说不是什么问题,因为JS代码无论如何都可以在浏览器中访问,因此您的安全模型不应该基于代码是不变的,但是,注入黑客仍然可能是个问题,尤其是跨站点攻击)eval()
var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);