1、什么是词法作用域:
词法作用域就是定义在词法阶段的作用域。换句话说,就是由你在写代码时将变量和块级作用域写在哪里来决定的(而不是在哪里调用),因此当词法分析器处理代码时会保持作用域不变(大部分情况下是这样的)。js的引擎在编译阶段进行的一些优化能够根据代码的词法进行静态分析,并预先确定所有变量和函数定义的位置,才能在执行过程中快速找到标识符。
2、作用域气泡
每一个函数作用域或者块作用域(es6之前没有块级作用域,只能用立即执行函数模拟)构成一个作用域气泡由其对应的作用域代码写在哪里决定,他们是逐级包含的。这里额包含是严格包含的,没有任何函数的气泡可以同时出现在两个外部作用域的气泡中,就如没有任何函数可以部分地同时出现在两个父级函数中一样。
3、查找
作用域气泡是层层包含的,引擎在需要变量的时候,会从内部到外部进行查找,查找会在找到第一个匹配的标识符时停止,同名的标识符,外层的会被内层的遮挡,产生屏蔽。
全局变量可以直接通过window.a直接访问到。
注意:当我们在查找一个变量的时候,无论函数在哪里被调用,如何被调用,都是根据词法作用域来找的,而它的词法作用域只由函数被声明时所处的位置决定。这和访问一个属性是完全不一样的。