直接总结吧:
eval()直接调用时,它在调用它的上下文中执行。
间接调用时,使用全局对象作为上下文作用域,并且无法读,写,定义局部变量和函数。
例子:
var geval = eval;//这里调用geval => 间接调用eval;
var x = "global", y = "global";
function fn(){ //此函数直接调用eval()
var x = "local";
eval("x = x +'changed'");
return x ;
}
function gn(){ //此函数间接调用eval()
var y = "local";
geval("y = y + 'changed'");
return y;
}
console.log(fn(), x);//这里会输出localchanged global,这里的localchanged 就是fn中返回的结果,而全局属性x依然为global;
console.log(gn(), y);//这里会输出local globalchanged,解释一下原因:
如前面所述,当间接调用eval()时,使用全局对象作为上下文作用域,并且无法读,写,定义局部变量和函数。
所以在gn()里面,就算var y = "local",geval()也是无法读取的,或者写的,它只能读到全局的var y = "global",最后就直接return了gn()里面定义的var y = "local";
但是又因为geval()使用全局对象作为上下文作用域,所以它在gn()里面,取得了全局的y = "global",
并使用 y = y + 'changed'改变了全局属性y的值为'globalchanged',所以console.log(gn(), y)输出了local globalchanged,前一个local为gn()直接return的,第二个globalchanged为全局y被geval()改变过的。
btw,我在提这个代码的时候一直提示,后来发现是如果标题中带了 eval()就会为非法字符,仿佛感受到了eval的威力。