var a = 2;
var foo = function(){
let a = 3;
console.log(a);
eval('(function(){window.a = 4;console.log(a, this)})()')
};
foo();
console.log(a);
运行foo(), 可以看出打印效果:
3
3
4
上面的运行代码,可以看出,执行eval的时候,eval本身有一个作用域,该作用域与运行时所在环境有关。上述代码中eval运行在foo中,foo的局部变量a的值初始值为3(注意这里是局部变量a(3)和全局变量a(2)所在作用域不同,这是两个不同的值),在eval中如果没有显式的表明变量的作用域,那么会优先使用执行所在域(foo)的变量。
function foo(str){
'use strict';
eval(str);
console.log(a); //ReferenceError: a is not defined
}
foo('var a = 2');
上述代码可以看出eval在运行时有其自己的作用域,意味着其中的声明无法修改所在作用域(上述的代码a未在eval运行所在所用域中声明)。