eval()和new 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()
将字符串评估为当前执行范围内的JavaScript表达式,并可以访问局部变量。 new Function()
将存储在一个字符串中的JavaScript代码解析为一个函数对象,然后可以调用它。 它不能访问局部变量,因为代码在单独的作用域中运行。 考虑这个代码:
function test1() {
var a = 11;
eval('(a = 22)');
alert(a); // alerts 22
}
如果使用new Function('return (a = 22);')()
,局部变量a
将保留其值。 尽管如此,一些JavaScript程序员,例如道格拉斯克罗克福德认为,除非绝对必要,否则不应该使用,并且对不可信数据评估/使用Function
构造Function
是不安全和不明智的。
没有。
在你的更新中, 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');
new Function
创建一个可重用的函数。 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]');
}
这个函数与新函数最大的区别在于函数不是词法范围的。 所以它不会访问关闭变量,也不会。
链接地址: http://www.djcxy.com/p/16987.html