Eval vs execscript

Eval vs execscript

本文关键字:execscript vs Eval      更新时间:2023-09-26

实际上,网络上的每个javascript指南都对我大喊eval不好,不要使用它,它是一个安全漏洞等等。最近我发现了window.execScript,它似乎做了与eval相同的事情。在安全性或速度方面,一个比另一个好吗?

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

eval很糟糕,但大多数时候可以用new Function代替,它更安全,而且是跨浏览器的:

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

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

更新2019。

埃瓦尔还不错,埃瓦尔被误解了,而且真的很强大。这几乎就是我们的开发人员工具的动力所在。Function构造函数的作用与eval相同,甚至具有相同的安全漏洞

Function构造函数创建一个新的Function对象。调用构造函数可以直接动态创建函数,但会受到影响来自安全性和类似(但远没有那么重要)性能要评估的问题。但是,与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/how-evil-is-eval/

奖金:如果希望new FunctionFunction的行为相同,可以通过键入(0, eval)简单地使用间接evalhttp://perfectionkills.com/global-eval-what-are-the-options/

现在,eval和Function基本上是一样的。

Ps。execScript已被弃用。

更新2021

如果你正在研究eval,并且你打算做一个沙盒,请帮自己一个忙,并使用类似的东西https://codesandbox.io/post/sandpack-announcementsandpack解决了javascript沙箱实现时的大部分问题。