Javascript Eval vs execscript

Javascript Eval vs execscript,javascript,eval,Javascript,Eval,实际上,web上的每一个javascript指南都对我大喊eval不好,不要使用它,它是一个安全漏洞等等。最近我发现了window.execScript,它似乎和eval做了同样的事情。在安全性或速度方面,一个比另一个好吗?窗口。execScript不跨浏览器,只有IE支持它。eval不好,但大多数情况下可以用新功能替换它,它更安全,更交叉: var foo = new Function('return 1 + 2'); var baz = eval('function(){ return 1

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

窗口。execScript
不跨浏览器,只有IE支持它。

eval
不好,但大多数情况下可以用
新功能替换它,它更安全,更交叉:

var foo = new Function('return 1 + 2');
var baz = eval('function(){ return 1 + 2 }');
主要区别在于范围访问
eval
会影响局部变量,而
新函数
会创建另一个作用域。

更新2019

Eval并不坏,Eval被误解了,它真的很强大。这正是我们的开发人员工具的动力所在。函数构造函数的作用与eval相同,甚至具有相同的安全漏洞

函数构造函数创建一个新的函数对象。呼叫 构造函数可以直接动态创建函数,但会受到影响 从安全性和类似(但不太重要)的性能 需要评估的问题。但是,与eval不同,函数构造函数创建 仅在全局范围内执行的函数。 块引用

对于eval和Function来说,有很多合法的例子,但真正的区别在于如何处理范围

我建议阅读这两篇文章来增加对这个主题的理解

奖金: 如果您想让
新函数
函数
具有相同的行为,只需键入
(0,eval)

现在,eval和函数基本相同


Ps.
execScript
已被弃用。

完全一样吗?@Delta检查这篇文章本页建议Chrome中的作品应该是var foo=new函数('return 1+2')();你在结尾处漏掉了()从Chrome的调试控制台运行
baz
行会给我一个“未捕获的语法错误:意外标记”(“你为
baz
编写的代码不起作用。你需要将
function(){…}
包装在
()
中,使其成为有效的函数表达式,否则它将无法运行:
const baz=eval('(function()){return 1+2;});
来自“IHTMLWindow2::execScript不再受支持。从Internet Explorer 11开始,使用eval”。