Javascript eval做什么?为什么它是邪恶的?

Javascript eval做什么?为什么它是邪恶的?,javascript,eval,Javascript,Eval,我一直在网上阅读eval()函数,但除了“它对表达式求值””之外,我无法真正理解它的实际功能 我们应该只对数值使用eval()函数吗 在这种情况下,只需使用myObject[myString] eval被严重滥用。我发现它的唯一有效用途就是在旧浏览器中解析JSON。eval()获取给定的字符串,并像运行普通JavaScript代码一样运行它 它被认为是“邪恶的”,因为: 它使事情变得过于复杂-在使用eval()的大多数情况下,会有一个更简单的解决方案,而不需要它。问题中的这个例子就是一个很好的

我一直在网上阅读eval()函数,但除了“它对表达式求值””之外,我无法真正理解它的实际功能


我们应该只对数值使用eval()函数吗

在这种情况下,只需使用
myObject[myString]

eval
被严重滥用。我发现它的唯一有效用途就是在旧浏览器中解析JSON。

eval()
获取给定的字符串,并像运行普通JavaScript代码一样运行它

它被认为是“邪恶的”,因为:

  • 它使事情变得过于复杂-在使用
    eval()
    的大多数情况下,会有一个更简单的解决方案,而不需要它。问题中的这个例子就是一个很好的例子:对于这样的表达式,绝对不需要
    eval()
    。JS具有非常好的语法,可以将对象属性名称作为字符串引用(
    myObject[“x”]
    myObject.x
    相同)

  • 调试要困难得多-在调试器中使用它要困难得多,即使您已经设法弄清楚发生了什么,您仍有额外的工作要做,因为您必须同时调试eval代码和生成要eval的原始字符串的代码

  • 它会减慢速度-脚本编译器无法在
    eval()
    中预编译代码,因为它在到达那里之前不知道代码将包含什么。因此,您失去了现代Javascript引擎的一些性能优势

  • 这是黑客的梦想-
    eval()
    以代码的形式运行字符串。黑客喜欢这样做,因为向程序中注入字符串比注入代码容易得多;但是
    eval()
    意味着您可以插入一个字符串,并让它作为代码运行。因此
    eval()
    使您的代码更容易被破解。(与其他语言相比,这对于基于浏览器的Javascript来说不是什么问题,因为JS代码无论如何都可以在浏览器中访问,因此您的安全模型不应该基于代码是不变的,但是,注入黑客仍然可能是个问题,尤其是跨站点攻击)


看看右边的相关问题。它对于创建除数据外还存储功能的自修改json类文件来说,似乎功能强大得令人难以置信。例如,您可以创建一个服务器,通过检查您想要的功能是否为(parsedObject中的“功能”),来“学习”,如果不是,它可以让客户端将该方法教给该对象。这反过来又使“活库”得以建立,并从您通过消息而不是编辑代码向他们传授知识中成长起来。我不认为eval是邪恶的,而是最强大的javascript构造。有趣的是,php的eval比javascript的eval弱,因为javascript能够打印非本机函数的代码,所以只要对象是非本机函数,就可以将其字符串化回字符串。而在PHP中,你无法做到这一点,因此自行编写PHP更难实现,而在JavaScript中,读取一个对象、转换想要字符串的方法、更改它、将它放回字符串、将更改写入对象、将对象写入文件非常简单,有效地实现了自行编写代码
var myString = "x",
    myObject = {
        x: 10
    },
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);