qwe*_*ymk 86 javascript optimization eval 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'));
Run Code Online (Sandbox Code Playgroud)
Ple*_*and 109
不,他们不一样.
eval() 将字符串计算为当前执行范围内的JavaScript表达式,并可以访问局部变量.new Function()将存储在字符串中的JavaScript代码解析为函数对象,然后可以调用该函数对象.它无法访问局部变量,因为代码在单独的范围内运行.考虑以下代码:
function test1() {
var a = 11;
eval('(a = 22)');
alert(a); // alerts 22
}
Run Code Online (Sandbox Code Playgroud)
如果new Function('return (a = 22);')()使用,则局部变量a将保留其值.然而,一些JavaScript程序员如道格拉斯克罗克福德认为,也不应该使用,除非绝对必要,并evaling /使用Function上不受信任的数据构造是不安全的,不明智的.
没有.
在您的更新中,调用evaluate并func产生相同的结果.但是,他们绝对不是"在幕后做同样的事情".该func函数创建一个新函数,但随后立即执行它,而该evaluate函数只是在现场执行代码.
从原来的问题:
var evaluate = function(string) {
return eval(string);
}
var func = function(string) {
return (new Function( 'return (' + string + ')' )());
}
Run Code Online (Sandbox Code Playgroud)
这些将给你非常不同的结果:
evaluate('0) + (4');
func('0) + (4');
Run Code Online (Sandbox Code Playgroud)
new Function创建一个可以重用的功能.eval只执行给定的字符串并返回最后一个语句的结果.当您尝试创建使用Function来模拟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]');
}
Run Code Online (Sandbox Code Playgroud)
这个和新函数之间的最大区别在于函数不是词法范围的.所以它不能访问闭包变量和我的.