6

实际上,网络上的每个 javascript 指南都向我喊道 eval 不好,不要使用它,这是一个安全漏洞等等。最近我发现了window.execScript,它似乎和eval 做同样的事情。就安全性或速度而言,一个比另一个更好吗?

4

3 回答 3

8

window.execScript不跨浏览器,只有IE支持。

于 2012-08-31T02:41:40.547 回答
5

evalnew Function很糟糕,但它可以在大多数情况下被替换,它更安全并且它是跨浏览器:

var foo = new Function('return 1 + 2');
var baz = eval('function(){ return 1 + 2 }');

主要区别在于范围访问。可以影响创建另一个范围的eval局部变量。new Function

于 2012-08-31T03:07:26.093 回答
2

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 实现沙箱时的大部分问题。

于 2019-12-15T08:24:48.967 回答