首页 > 解决方案 > 为什么我们需要 VariableEnvironment 来识别 Javascript 中执行上下文的状态?

问题描述

在 ECMAScript 规范中,声明:

词汇环境:

标识用于解析此执行上下文中的代码所做的标识符引用的词法环境。

还,

执行上下文的 LexicalEnvironment 和 VariableEnvironment 组件始终是 Lexical Environments。创建执行上下文时,它的 LexicalEnvironment 和 VariableEnvironment 组件最初具有相同的值。

然后:

通常,词法环境与 ECMAScript 代码的某些特定语法结构相关联,例如 FunctionDeclaration、BlockStatement 或 TryStatement 的 Catch 子句,并且每次评估此类代码时都会创建一个新的词法环境

问题是,为什么我们首先需要一个 VariableEnvironment,因为 LexicalEnvironment 似乎足以跟踪变量值绑定?

现在,让我们看一下 JavaScript [评论中的问题] 中的代码示例:

var a = 1;
function x(b){
    var c = 2;
    // During the creation phase of the excution context of the function 
    // the ifStatement Block will it be skipped? 
    if(c >= 1){
        let d = 3;
        // Does e belongs to the Lexical Environment of the IfStatementBlock or to the FunctionDeclaration?
        var e = 4; 
        a = 5;
    }
}

标签: javascriptexecutioncontext

解决方案


VariableEnvironment用于范围为整个函数的名称,而LexicalEnvironment用于范围为最近的封闭块(EcmaScript 6letconst声明)的名称。

在您的示例中,c两者e都属于函数的VariableEnvironmentvar声明被提升到函数的顶部,但除非进入块,e否则不会被初始化。if所以它相当于:

var a = 1;

function x(b) {
  var c = 2;
  var e;
  if (c >= 1) {
    let d = 3;
    e = 4;
    a = 5;
  }
}


推荐阅读