在学习《你不知道的JS》一书中,特将作用域相关知识在此分享一下:
#说到作用域,就不得不提到LHS查询和RHS查询:
1)如果查询目的是对变量进行赋值,则使用LHS查询
2)如果查询目的是获取变量的值,则使用RHS查询
作用域的查询都会从当前执行的作用域开始查找,如果没有找到所需要的标识符,就会向上级作用域继续查找,直到抵达全局作用域为止
# 当进行RHS查询时无法找到该变量,引擎则会抛出ReferenceError的异常
代码示例如下:
function foo(a){
console.log(a+b);
b = a;
}
foo(2);
在此代码示例中未声明b变量,因此RHS查询时无法找到它,则抛出ReferenceError异常
#当RHS查询时找到了变量,但试图对一个非函数类型的值进行函数调用,或者引用null或undefined类型的值中的属性,则引擎会抛出另一种异常:TypeError
在作用域查找中还有非常重要的一点: "遮蔽效应"
作用域查找会在找到第一个匹配的标识符时停止,在多层嵌套作用域中可以定义同名的标识符,叫做'遮蔽效应'
代码示例如下:
var b = 4; function foo(a){ var b = 3; console.log(a+b); } foo(2);//5
这里由于作用域查找中具有遮蔽效应,引擎会先找到执行作用域中的 var b = 3,将执行作用域名之外的 var b = 4遮蔽,因此即便外面也用的是相同的变量b作为标识符,也并不影响函数的执行
那么如何来访问那些被同名变量所遮蔽的全局变量呢,在这里,我们可以引入window.a的技术;
注意:通过这种技术可以访问那些被遮蔽的全局变量,但非全局的变量被遮蔽则无论如何都无法被访问