词法作用域
简单地说,词法作用域就是定义在词法阶段的作用域。
换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变
词法作用域可以采取方法来进行欺骗操作,改变作用域,比如闭包
变量查找
引擎通过词法作用域中的各个变量的嵌套位置关系,来查找变量的正确信息。
作用域查找到第一个匹配元素就会停止查询。
遮蔽效应:多层嵌套中,外部作用域标识符会被内层作用域的同名标识符遮蔽
词法欺骗
eval()
接受一个字符串为参数,字符串是一段js代码,然后eval函数解析这段js代码并执行。
function foo(str, a) {
eval( str ); // 欺骗!
console.log( a, b );
}
var b = 2;
foo( "var b = 3;", 1 ); // 1, 3
foo
函数执行以后,将var =3
解析在了foo的作用域中,等于在函数作用域中追加了一个变量,并且遮蔽了全部的变量b
,这样看起来就好像是对已经存在的foo函数作用域进行的认为的修改。
with
var obj = {
a: 1,
b: 2,
c: 3
};
//直接引用书写麻烦
obj.a = 2;
obj.b = 3;
obj.c = 4;
//with引用都就可以像使用变量一样引用对象属性
with (obj) {
a = 3;
b = 4;
c = 5;
console.log(a+b) // 7,
}