Contents

词法环境

Contents

词法环境

词法环境是一种规范类型, 用于根据 ECMAScript 代码的词法嵌套结构定义标识符与特定变量和函数的关联.一个词法环境由一个 Environment Records 和一个可能为空的外部词法环境的引用组成.通常, 词法环境与 ECMAScript 代码的特定句法结构有关.例如函数申明, 块语句, try 语句中的catch等代码每次运算后会产生新的词法环境.

简单来说词法环境是一种持有标识符—变量映射的结构.(这里的标识符指的是变量/函数的名字, 而变量是对实际对象[包含函数类型对象]或原始数据的引用).

它由两个组成部分:

  • 环境记录: 存储变量和函数声明的实际位置

  • 对外部环境的引用: 可以访问其外部词法环境

词法环境有两种类型:

  • 全局环境: 是一个没有外部环境的词法环境, 其外部环境引用为 null.拥有一个全局对象 (window 对象) 及其关联的方法和属性 (例如数组方法) 以及任何用户自定义的全局变量, this 的值指向这个全局对象.

  • 函数环境: 用户在函数中定义的变量被存储在环境记录中, 包含了 arguments 对象.对外部环境的引用可以是全局环境, 也可以是包含内部函数的外部函数环境.

直接看代码可能更加直观:

// 全局执行上下文
interface GlobalExecutionContext {
  // 词法环境
  LexicalEnvironment: {
    // 环境记录
    EnvironmentRecord: {
      // 全局环境
      Type: 'Object';
      // 标识符绑定在这里
      outer: null; // 对外部环境的引用
    };
  };
}

// 函数执行上下文
interface FunctionExecutionContext<GlobalOrOuterFunctionEnvironmentReference = any> {
  // 词法环境
  LexicalEnvironment: {
    // 环境记录
    EnvironmentRecord: {
      Type: 'Declarative'; // 函数环境
      // 标识符绑定在这里 			  // 对外部环境的引用
      outer: GlobalOrOuterFunctionEnvironmentReference;
    };
  };
}

参考链接

Lexical Environments (词法环境) 和 Environment Records (环境记录)

[译] 理解 JavaScript 中的执行上下文和执行栈