eval()和new Function()是一样的吗?

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

var evaluate = function(string) { return eval('(' + string + ')'); } var func = function(string) { return (new Function( 'return (' + string + ')' )()); } console.log(evaluate('2 + 1')); console.log(func('2 + 1')); 

不,他们一样。

  • eval()将string评估为当前执行范围内的JavaScriptexpression式,并可以访问局部variables。
  • new Function()将存储在一个string中的JavaScript代码parsing为一个函数对象,然后可以调用它。 它不能访问局部variables,因为代码在一个单独的范围内运行。

考虑这个代码:

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

如果使用new Function('return (a = 22);')() ,则局部variablesa将保留其值。 尽pipe如此,像Douglas Crockford这样的一些JavaScript程序员认为,除非绝对必要 ,否则都不应该被使用 ,并且在不可信数据上评估/使用Function构造Function是不安全和不明智的。

没有。

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

从原来的问题来看:

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

这些会给你非常不同的结果:

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

new Function创build一个可以重用的函数。 eval只是执行给定的string并返回最后一条语句的结果。 当您试图创build一个使用函数来模拟eval的包装函数时,您的问题被误导了。

他们在窗帘背后分享了一些代码是不是真的? 是的,很可能。 完全相同的代码? 不,当然。

为了好玩,这里是我自己不完善的实现,使用eval来创build一个函数。 希望它能让我们看到差异!

 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]'); } 

这个和新函数最大的区别在于函数不是从词汇的范围。 所以它将无法访问closuresvariables和我的会。

如果你的意思是,它会产生相同的结果,那么是的…但只是eval(即“评估这串JavaScript”)会简单得多。

编辑如下:

这就像是说…这两个math问题是一样的:

1 + 1

1 + 1 + 1 – 1 + 1 – 1 * 1/1

在这个例子中,结果是一样的,是的。 两者都执行你传递的expression式。 这是什么让他们如此危险。

但是他们在这个背后做了不同的事情。 一个涉及new Function() ,在幕后,创build一个匿名函数从你提供的代码,这是执行函数时调用。

在你调用匿名函数之前,传递给它的JavaScript在技术上不会被执行。 这与eval()执行代码形成对比,并且不会根据它生成函数。

只是想指出这里的例子中使用的一些语法,它是什么意思:

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

请注意函数(…)()最后有“()”。 此语法将导致func执行新函数,并返回string不是返回string的函数,但如果使用以下内容:

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

现在func将返回一个返回string的函数。