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
是不安全和不明智的。
没有。
在你的更新中, evaluate
和func
的调用产生相同的结果。 但是,他们绝对不是“在幕后做同样的事情”。 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的函数。