词法环境
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;
};
};
}