Javascript 使用eval()的奇怪关闭行为--为什么?
首先,请不要警告我eval()。我明白了。假设我只是好奇 接下来,在下面的代码中,eval(…)创建一个闭包并捕获参数“arg1” 其输出为“闭包打印arg1:hek”。伟大的正如所料 然而。。。如果我将eval赋值给一个变量并执行相同的操作,则闭包不会捕获“arg1” 此代码段的输出是未定义arg1。如果我测试以确保eval和fn_uu相等,它们是 请注意,如果我在test()的主体中放入this.arg2,则eval和fn_uu都会在闭包中捕获arg2。所以这种奇怪的现象只适用于你要结束的函数的参数Javascript 使用eval()的奇怪关闭行为--为什么?,javascript,closures,eval,Javascript,Closures,Eval,首先,请不要警告我eval()。我明白了。假设我只是好奇 接下来,在下面的代码中,eval(…)创建一个闭包并捕获参数“arg1” 其输出为“闭包打印arg1:hek”。伟大的正如所料 然而。。。如果我将eval赋值给一个变量并执行相同的操作,则闭包不会捕获“arg1” 此代码段的输出是未定义arg1。如果我测试以确保eval和fn_uu相等,它们是 请注意,如果我在test()的主体中放入this.arg2,则eval和fn_uu都会在闭包中捕获arg2。所以这种奇怪的现象只适用于你要结束的函
eval
由编译器专门识别。这就是允许它引入和访问局部变量绑定的原因。但是编译器只能在使用它的正常名称时才能识别它。当它看到对fn\uu
的调用时,它无法判断此变量是否等同于eval
,因此它将其编译为正常的函数调用
有关这方面的详细信息,请参阅
var fnStr = "(function() { console.log('closure print arg1: '+arg1);})();";
function test(arg1) {
eval(fnStr);
}
test('hek');
var fn_ = eval;
var fnStr = "(function() { console.log('closure print arg1: '+arg1);})();";
function test(arg1) {
fn_(fnStr);
}
test('hek');