◆
JavaScript 词法作用域详解与变量查找机制
什么是词法作用域
- 词法作用域就是定义在词法阶段的作用域,是由写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处理代码时会保持作用域不变。
词法作用域,也叫静态作用域,它的作用域是指在词法分析阶段就确定了,不会改变。动态作用域是在运行时根据程序的流程信息来动态确定的,而不是在写代码时进行静态确定的。
作用域嵌套
如下代码有三个逐级嵌套的作用域
function foo(a) {
var b = a * 2;
function bar(c) {
console.log(a, b, c);
}
bar(b * 3);
}
foo(2); // 2, 4, 12
借助图片来看,上述代码共有三个作用域

- 包含着整个全局作用域,其中只有一个标识符:
foo。 - 包含着
foo所创建的作用域,其中有三个标识符:a、bar和b。 - 包含着
bar所创建的作用域,其中只有一个标识符:c。
作用域中的变量查找
再如同上述代码,当执行到 console.log( a, b, c ) 时,js 引擎是如何查找这三个变量的呢。
- 首先会从最内部的作用域,也就是
bar(..)函数的作用域开始查找 - 引擎无法在 这里找到
a,因此会去上一级到所嵌套的foo(..)的作用域中继续查找 - 在这里找到了
a, 因此引擎使用了这个引用。 - 对于其他的变量以此类推.
- 作用域查找会在找到第一个匹配的标识符时停止。
- 在多层的嵌套作用域中可以定义同名的 标识符,这叫作“遮蔽效应”(内部的标识符“遮蔽”了外部的标识符)。
- 抛开遮蔽效应,作用域查找始终从运行时所处的最内部作用域开始,逐级向外或者说向上进行,直到遇见第一个匹配的标识符为止。
tip
通过使用 eval、with 可以修改词法作用域的位置,但通常是不建议使用的。

还没有留言,来发表第一条吧~