实际上,网络上的每个 javascript 指南都向我喊道 eval 不好,不要使用它,这是一个安全漏洞等等。最近我发现了window.execScript,它似乎和eval 做同样的事情。就安全性或速度而言,一个比另一个更好吗?
3 回答
window.execScript
不跨浏览器,只有IE支持。
eval
new Function
很糟糕,但它可以在大多数情况下被替换,它更安全并且它是跨浏览器:
var foo = new Function('return 1 + 2');
var baz = eval('function(){ return 1 + 2 }');
主要区别在于范围访问。可以影响创建另一个范围的eval
局部变量。new Function
2019 年更新。
eval 还不错,eval 被误解了,真的很强大。几乎是我们开发人员工具的动力。Function 构造函数与 eval 的目的相同,甚至具有相同的安全漏洞
Function 构造函数创建一个新的 Function 对象。直接调用构造函数可以动态创建函数,但会遇到安全性和与 eval 类似(但不太重要)的性能问题。但是,与 eval 不同的是,Function 构造函数创建的函数仅在全局范围内执行。块引用 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
eval 和 Function 存在合法案例,唯一真正的区别是范围的处理方式。
我建议阅读这两篇文章以增加对这个主题的理解https://blogs.msdn.microsoft.com/ericlippert/2003/11/01/eval-is-evil-part-one/ https://javascriptweblog.wordpress。 com/2010/04/19/邪恶如何评价/
奖励:如果您想拥有new Function
或表现相同,您可以通过键入http://perfectionkills.com/global-eval-what-are-the-options/Function
来简单地使用间接评估(0, eval)
所以你去吧, eval 和 Function 几乎是一样的。
附言。execScript
已被弃用。
2021 年更新
如果您正在研究 eval 并且打算做一个沙箱,请帮自己一个忙并使用https://codesandbox.io/post/sandpack-announcement sandpack
之类的东西,它已经解决了为 javascript 实现沙箱时的大部分问题。