Javascript eval()和new Function()是一回事吗?

Javascript eval()和new Function()是一回事吗?,javascript,function,optimization,eval,Javascript,Function,Optimization,Eval,这两个功能在幕后做同样的事情吗?(在单语句函数中) 在那个例子中,结果是一样的,是的。两者都执行传递的表达式。这就是他们如此危险的原因 但它们在场景背后做着不同的事情。涉及new Function()的函数在幕后使用您提供的代码创建匿名函数,该函数在调用函数时执行 在调用匿名函数之前,传递给它的JavaScript在技术上不会执行。这与立即执行代码的eval()相反,它不会基于代码生成函数。如果您的意思是,它会产生相同的结果,那么是的。。。但是仅仅是eval(又名“评估这个JavaScript字

这两个功能在幕后做同样的事情吗?(在单语句函数中)


在那个例子中,结果是一样的,是的。两者都执行传递的表达式。这就是他们如此危险的原因

但它们在场景背后做着不同的事情。涉及
new Function()
的函数在幕后使用您提供的代码创建匿名函数,该函数在调用函数时执行


在调用匿名函数之前,传递给它的JavaScript在技术上不会执行。这与立即执行代码的
eval()
相反,它不会基于代码生成函数。

如果您的意思是,它会产生相同的结果,那么是的。。。但是仅仅是eval(又名“评估这个JavaScript字符串”)就简单多了

编辑如下:

就像说。。。这两道数学题是一样的吗

1+1

1+1+1-1+1-1*1/1号

在更新中,对
evaluate
func
的调用会产生相同的结果。但是,他们绝对不是“在幕后做同样的事情”。
func
函数创建一个新函数,然后立即执行它,而
evaluate
函数只是当场执行代码

原问题:

var evaluate = function(string) {
    return eval(string);
}
var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}
这些将给您带来非常不同的结果:

evaluate('0) + (4');
func('0) + (4');

新函数
创建一个可重用的函数
eval
只执行给定的字符串并返回最后一条语句的结果。当您试图创建一个使用函数模拟eval的包装函数时,您的问题被误导了

他们在幕后共享一些代码是真的吗?是的,很有可能。完全相同的代码?当然没有

为了好玩,这里是我自己使用eval创建函数的不完美实现。希望它能让我们了解其中的差异

function makeFunction() {
  var params = [];
  for (var i = 0; i < arguments.length -  1; i++) {
    params.push(arguments[i]);
  }
  var code = arguments[arguments.length -  1];


 // Creates the anonymous function to be returned
 // The following line doesn't work in IE
 // return eval('(function (' + params.join(',')+ '){' + code + '})');
 // This does though
 return eval('[function (' + params.join(',')+ '){' + code + '}][0]');
}
函数makeFunction(){
var参数=[];
for(var i=0;i

此函数与新函数之间的最大区别在于,函数的作用域不是词汇性的。因此,它将无法访问闭包变量,而我的则可以。

不,它们是不同的

  • eval()
    将字符串计算为当前执行范围内的JavaScript表达式,并可以访问局部变量
  • new Function()
    将存储在字符串中的JavaScript代码解析为函数对象,然后可以调用函数对象。它无法访问局部变量,因为代码在单独的作用域中运行
考虑以下代码:

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22
}

如果使用了
new函数('return(a=22);')()
,则局部变量
a
将保留其值。尽管如此,一些JavaScript程序员,如Douglas Crockford,认为除非对不受信任的数据使用
函数
构造函数是不安全和不明智的

 var func = function(string) {
     return (new Function( 'return (' + string + ')' )());
 }
请注意,函数(…)()的末尾有“()”。此语法将导致func执行新函数并返回字符串,而不是返回字符串的函数,但如果您使用以下命令:

 var func = function(string) {
     return (new Function( 'return (' + string + ')' ));
 }

现在func将返回一个返回字符串的函数。

它们是否都重新解析字符串?它们都将解析字符串(在您的代码示例中)。我不知道你说的“重新解析”是什么意思。我肯定他们都在某个时候解析(计算)字符串,但是
函数
对象可能会在调用函数时将字符串存储在私有成员变量中,以
eval
。在任何情况下,除了最特殊的情况外,这两种做法都是不好的。好吧,根据他的实施情况,你捏造了你的例子。他是否将evaluate实现为
returneval(“(“+string+”)”)然后它们会产生相同的结果。@Juan我没想到,但是是的。编辑这个问题你能再解释一下吗?它们不是都在return语句中执行吗?函数()是否使用了比eval更高的堆栈调用级别?
函数()是否使用了比eval更高的堆栈调用级别?
:我假设是这样,因为
eval()
不会根据输入创建函数,它只是执行它
new Function()
创建一个新函数,然后调用该函数。@SimpleCoder:Function()不向调用堆栈添加任何内容。仅当调用结果函数时。eval做了完全相同的事情(如果应用在问题的上下文中),“永远不应该被使用”是如此广泛的陈述。当任何输入超出您的控制时,不应使用。话虽如此,我从来不需要使用它,除了解析JSON。但我在这里回答了一些似乎是有效使用的问题,其中包括允许管理员生成最终用户可以使用的模板函数。在本例中,输入由管理员生成,因此acceptable@Juan:Crockford的观点是eval经常被误用(取决于您的视角),因此它应该被排除在“最佳实践”JavaScript之外。不过,我确实同意,当输入第一次正确验证时,它对于JSON或算术表达式解析等用途非常有用。甚至Crockford也在他的JSON库json2.js中使用它。那么这是否意味着
新函数(code)
eval('(Function(){'+code+')())
相同,或者它是一个全新的执行上下文?@GeorgeMauer:我想你的意思是
eval('(Function(){'+code+'))
,它将返回一个函数对象,"
 var func = function(string) {
     return (new Function( 'return (' + string + ')' ));
 }