JS高级 - 词法环境

152 阅读2分钟

词法环境

在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语句,当它们的代码被执行时,词法环境被创建出来

image.png

环境记录

为了兼容老版本的语言,环境记录也被划分为了两类

类型说明
声明式环境记录存储 letconst 声明的变量
存在暂时性死区(TDZ),即在声明之前访问这些变量会导致引用错误
这些变量在作用域内是块级作用域。
对象式环境记录存储 var 声明的变量和 function 声明的函数
这些变量在整个函数或全局作用域内可用,不存在块级作用域
函数声明会被提升到作用域的顶部,这意味着函数可以在声明之前调用

为了保持一致性和向后兼容性,function 声明仍然存储在对象式环境记录中。