《你不知道的JavaScript-上卷》第一部分-附录A-笔记-动态作用域

54 阅读1分钟

动态作用域

JavaScript 中的作用域就是词法作用域

  • 词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则。
  • 词法作用域最重要的特征是它的定义过程发生在代码的书写阶段

动态作用域

  • 让作用域作为一个在运行时就被动态确定的形式,而不是在写代码时进行静态确定的形式

示例代码

function foo() {
    console.log( a ); // 2
}
function bar() {
    var a = 3;
    foo();
}
var a = 2;
bar();

上面是词法作用域输出的结果,而动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用,即作用域链是基于调用栈的,而不是代码中的作用域嵌套。

所以在动态作用域中

function foo() {
    console.log( a ); // 3(不是 2 !)
}
function bar() {
    var a = 3;
    foo();
}
var a = 2;
bar();
  • 当 foo() 无法找到 a 的变量引用时,会顺着调用栈在调用 foo() 的地方查找 a,而不是在嵌套的词法作用域链中向上查找。
  • 由于 foo() 是在 bar() 中调用的,引擎会检查 bar() 的作用域,并在其中找到值为 3 的变量 a。

总结与对比

  • 词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定
  • 词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用。