eval 函数是一种强大而简单的动态生成代码的方法,那么有什么注意事项呢?
为什么使用 JavaScript eval 函数是个坏主意?
不正确使用eval 会打开您的代码进行注入攻击
调试可能更具挑战性(没有行号等)
eval 代码执行速度较慢(没有机会编译/缓存 eval 代码)
编辑:正如@Jeff Walden 在评论中指出的那样,今天的 #3 不如 2008 年那么真实。然而,虽然可能会发生一些编译脚本的缓存,但这将仅限于未经修改而重复 eval 的脚本。更可能的情况是您正在评估每次都经过轻微修改的脚本,因此无法缓存。我们只是说一些 eval'd 代码执行得更慢。
eval 并不总是邪恶的。有时它是完全合适的。
然而, eval 目前和历史上被那些不知道自己在做什么的人过度使用。不幸的是,这包括编写 JavaScript 教程的人,在某些情况下,这确实会产生安全后果——或者更常见的是简单的错误。所以我们能做的越多,对 eval 打一个问号就越好。任何时候使用 eval 时,您都需要仔细检查您在做什么,因为您可能会以一种更好、更安全、更清洁的方式来做。
举一个非常典型的例子,使用存储在变量“potato”中的 id 设置元素的颜色:
eval('document.' + potato + '.style.color = "red"');
如果上述代码的作者对 JavaScript 对象的工作原理有所了解,他们就会意识到可以使用方括号代替文字点名称,从而无需使用 eval:
document[potato].style.color = 'red';
...这更容易阅读,而且潜在的错误更少。
(但是,/真正/知道自己在做什么的人会说:
document.getElementById(potato).style.color = 'red';
这比直接从文档对象中访问 DOM 元素的狡猾老技巧更可靠。)
我相信这是因为它可以从字符串中执行任何 JavaScript 函数。使用它可以让人们更容易地将恶意代码注入到应用程序中。
想到两点:
安全性(但只要您自己生成要评估的字符串,这可能不是问题)
性能:直到要执行的代码未知,才能优化。(关于 javascript 和性能,当然是Steve Yegge 的演讲)
如果您传递 eval 用户输入,这通常只是一个问题。