Page 73 - 你不知道的JavaScript(上卷)
P. 73
附 录 A
动态作用域
在第 2 章中,我们对比了动态作用域和词法作用域模型,JavaScript 中的作用域就是词法
作用域(事实上大部分语言都是基于词法作用域的)。
我们会简要地分析一下动态作用域,重申它与词法作用域的区别。但实际上动态作用域是
JavaScript 另一个重要机制 this 的表亲,本书第二部分“this 和对象原型”中会有详细
介绍。
从第 2 章中可知,词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规
则。词法作用域最重要的特征是它的定义过程发生在代码的书写阶段(假设你没有使用
eval() 或 with)。
动态作用域似乎暗示有很好的理由让作用域作为一个在运行时就被动态确定的形式,而不
是在写代码时进行静态确定的形式,事实上也是这样的。我们通过示例代码来说明:
function foo() {
console.log( a ); // 2
}
function bar() {
var a = 3;
foo();
}
var a = 2;
bar();
词法作用域让 foo() 中的 a 通过 RHS 引用到了全局作用域中的 a,因此会输出 2。
58