eval函数是一种强大而简单的动态生成代码的方法,那么有什么注意事项呢?
当前回答
Eval并不总是邪恶的。有些时候,这是非常合适的。
然而,eval在当前和历史上都被那些不知道自己在做什么的人过度使用。不幸的是,这包括编写JavaScript教程的人,在某些情况下,这确实会产生安全后果——或者,更常见的是,简单的错误。所以,我们在eval上加的问号越多越好。任何时候你使用eval你都需要检查你正在做的事情,因为你可能会用一种更好,更安全,更干净的方式来做。
举一个非常典型的例子,设置id存储在变量'potato'中的元素的颜色:
eval('document.' + potato + '.style.color = "red"');
如果上面这类代码的作者对JavaScript对象工作的基本原理有所了解,他们就会意识到可以使用方括号来代替字面上的点名称,从而消除了eval的需要:
document[potato].style.color = 'red';
...这更容易阅读,也更少潜在的错误。
(但是,那些/真正/知道自己在做什么的人会说:
document.getElementById(potato).style.color = 'red';
这比直接从文档对象中访问DOM元素更可靠。)
其他回答
如果你想让用户输入一些逻辑函数并计算与或,那么JavaScript的eval函数是完美的。我可以接受两个字符串和eval(ate) string1 === string2等。
通常只有在传递eval用户输入时才会出现问题。
Eval并不总是邪恶的。有些时候,这是非常合适的。
然而,eval在当前和历史上都被那些不知道自己在做什么的人过度使用。不幸的是,这包括编写JavaScript教程的人,在某些情况下,这确实会产生安全后果——或者,更常见的是,简单的错误。所以,我们在eval上加的问号越多越好。任何时候你使用eval你都需要检查你正在做的事情,因为你可能会用一种更好,更安全,更干净的方式来做。
举一个非常典型的例子,设置id存储在变量'potato'中的元素的颜色:
eval('document.' + potato + '.style.color = "red"');
如果上面这类代码的作者对JavaScript对象工作的基本原理有所了解,他们就会意识到可以使用方括号来代替字面上的点名称,从而消除了eval的需要:
document[potato].style.color = 'red';
...这更容易阅读,也更少潜在的错误。
(但是,那些/真正/知道自己在做什么的人会说:
document.getElementById(potato).style.color = 'red';
这比直接从文档对象中访问DOM元素更可靠。)
随着带有JavaScript编译器的下一代浏览器问世,这可能会成为一个更大的问题。通过Eval执行的代码在这些新浏览器上的表现可能不如JavaScript的其他部分。应该有人来做侧写。
除非您100%确定正在评估的代码来自可信的来源(通常是您自己的应用程序),否则这将使您的系统暴露于跨站点脚本攻击。