2013-08-16 43 views

回答

10

eval()接受它给出的字符串,并运行它,就像它是纯JavaScript代码一样。

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

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

  • 这是更难调试 -这是很难在调试器与它的工作,甚至一旦你已经设法找出发生了什么事情,你有额外的工作要做,因为你必须同时调试eval'd代码,以及将原始字符串生成为eval的代码。

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

  • 这是一个黑客的梦 -eval()运行一个字符串作为代码。黑客喜欢这个,因为在程序中注入字符串要比注入代码容易得多;但eval()意味着你可以注入一个字符串,并让它作为代码运行。所以eval()使你的代码更容易被破解。 (对于基于浏览器的Javascript而言,这比其他语言的问题更少,因为无论如何都可以在浏览器中访问JS代码,所以您的安全模型不应该基于您的代码是不可变的,但是注入攻击仍然可能是一个问题特别是在发生跨站点攻击时)。

6

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

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

+0

它似乎非常强大的创建自我修改类似JSON的文件,除了数据之外还可以存储功能。例如,你可以通过检查你想要的功能(parsedObject中的'功能')来创建一个“学习”的服务器,如果没有,它可以让客户端将该方法教给该对象。这反过来使得“生活的图书馆”可以从你通过信息而不是编辑代码的方式向他们传授信息而增长。我不认为eval是邪恶的,而是最强大的javascript构造。 – Dmitry

+0

有趣的是,PHP的eval比javascript的eval弱,因为javascript能够打印非本地函数的代码,因此只要非本地函数就可以将对象字符串化为字符串。而在PHP中,你不能这样做,所以使用自写php很难完成,而在JavaScript中,读取对象非常简单,可以将所需的方法转换为字符串,将其更改为字符串,并将更改写入对象,并将对象写入文件,从而有效地自行编写代码。 – Dmitry

+0

这种评价的演示是http://hastebin.com/eyacegaduq.coffee – Dmitry

相关问题