es6中的词法环境和变量环境
- 词法环境
词法环境是一种规范类型,用于词法嵌套解构中定义关联的变量,函数等标识符
一个词法环境进场用于关联一个函数声明,代码块语句,try-catch语句,当他们的代码被执行的时候,词法环境被创建出来
- 词法环境的分类
- 全局环境
没有外部环境引用的词法环境,外部环境引用为outer: null,拥有内建的object/ array对象等。在环境记录器里的原型函数,还有全局对象 - 函数环境
用户定义的变量存储在环境记录器,外部引用outer可以为全局环境,也可以为包含此内部函数的外部函数
- 全局环境
- 词法环境的组成
- 环境记录
- outer
- 环境记录
- 环境记录的组成 + 声明式环境记录 + 对象式环境记录
- 声明式环境记录
声明式环境变量记录用来定义es语法元素的效果,比如函数声明
,变量声明
,以及直接将标识符绑定于es语言值关联起来的catch子句 (函数环境中) - 对象环境记录器
用来定义出现在全局上下文
中的变量和函数的关系 (全局环境)
GlobalExectionContext = { LexicalEnvironment: { EnvironmentRecord: { type: "Object" } outer: <null> } } FunctionExectionContext = { LexicalEnvironment: { EnvironmentRecord: { type:"Declarative" } outer:<Global or outer function environment reference> } }
- 变量环境
- 用来处理var和function声明的标识符
执行上下文如下let a = 20 const b = 30 var c ; function multiply(e, f) { var g = 20 return e * f * g } c = multiply(20, 30)
GlobalExectionContext = { ThisBinding: <Global object>, LexicalEnvironment: { EnvironmentRecord: { type: "Object", a: <uninitialized> // 内存中已经为变量预留出空间,但是还没有和对应的标识符建立绑定关系,js引擎对函数的声明进行了特殊的处理,允许和var一样进行变量提升,但是不会访问出值,会报错 b: <uninitialized> } outer: <null> }, VariableEnvironment: { EnvironmentRecord: { Type:'object', c:undefined multiply: <func> } outer: <null> } } FunctionExectionContext = { ThisBinding: <Global object> LexicalEnvironment: { EnvironmentRecord: { type: "Declarative", arguments: {0: 20, 1: 30, length: 2} } outer: <GlobalExectionContext> }, VariableEnvironment: { EnvironmentRecord: { type: 'Declarative', g: undefined } outer: <GlobalLexicalEnvironment> } }