欺骗词法作用域:在运行时修改词法作用域
1.eval:
function foo(str,a){
eval(str);
console.log(a,b)
}
var b = 2;
foo("var b = 3",1) //1,3
执行foo()函数时eval()改变可foo的作用域,var b = 3 会对作用域修改,添加局部的b变量。
2.with:with的作用域随着他传入的参数不同而修改作用域
var obj = {
a:1,
b:2,
c:3
}
with(obj){
a=3;
b=4;
c=5;
}
function foo(obj){
with(obj){
a=2
}
}
var o1 = {
a: 3
};
var o2 = {
b: 3
};
foo( o1 );
console.log( o1.a ); // 2
foo( o2 );
console.log( o2.a ); // undefined
console.log( a ); // 2——不好,a 被泄漏到全局作用域上了
总结:可以修改作用域,但是却无法进行优化。