词法环境
在ES5中,代码执行关联以下术语
| 术语 | 说明 |
|---|---|
| 执行上下文栈 | Execution Context Stack,用于执行上下文的栈结构 |
| 执行上下文 | Execution Context,代码在执行之前会先创建对应的执行上下文 |
| 变量对象 | Variable Object,上下文关联的VO对象,用于记录函数和变量声明 |
| 全局对象 | Global Object,全局执行上下文关联的VO对象 |
| 激活对象 | Activation Object,函数执行上下文关联的VO对象 |
| 作用域链 | Scope chain,作用域链,用于关联指向上下文的变量查找 |
在ES6中,对对应的术语进行了调整,但是整体思路是一致的,
其中比较大的变化是ES5中执行上下文是由VO, this和 [[ scope ]]组成的
但是在ES6开始,执行上下文由词法环境(词法环境又可以由普通词法环境和变量环境组成)和this组成
词法环境是一种规范类型,用于在词法嵌套结构中定义关联的变量、函数等标识符
-
一个词法环境是由环境记录(Environment Record)和一个可能为空的外部词法环境(oute;r Lexical Environment)组成
-
一个词法环境经常用于关联一个函数声明、代码块语句、try-catch语句,当它们的代码被执行时,词法环境被创建出来

环境记录
为了兼容老版本的语言,环境记录也被划分为了两类
| 类型 | 说明 |
|---|---|
| 声明式环境记录 | 存储 let、const 声明的变量存在暂时性死区(TDZ),即在声明之前访问这些变量会导致引用错误 这些变量在作用域内是块级作用域。 |
| 对象式环境记录 | 存储 var 声明的变量和 function 声明的函数这些变量在整个函数或全局作用域内可用,不存在块级作用域 函数声明会被提升到作用域的顶部,这意味着函数可以在声明之前调用 |
为了保持一致性和向后兼容性,
function声明仍然存储在对象式环境记录中。