如何在词汇环境中管理块范围?

Ben*_*Ben 10 javascript ecmascript-6

如果我在函数中声明了一个变量,var那么该变量的一个插槽被添加到该LexicalEnvironment函数定义的中.

function() {
  var foo; 
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码LexicalEnvironment中,与函数关联的包含一个带有键foo和值的槽undefined.

如果我使用块范围声明,周围环境如何LexicalEnvironment受到影响?

function() {
  {
    let foo; // How does this affect the LexicalEnvironment?
  }
}
Run Code Online (Sandbox Code Playgroud)

moh*_*ias 5

function() {
  var foo; 
}
Run Code Online (Sandbox Code Playgroud)

如前所述,foo对于该LexicalEnvironment函数内的所有内部函数,全局可用。

function() {
  {
    let foo; // How does this affect the LexicalEnviroinment?
  }
}
Run Code Online (Sandbox Code Playgroud)

仅此区域foo是本地的。在该块之外将不可见。

它如何影响LexicalEnvironment

如果要引用,则foo在该块内的任何地方,局部变量let foo将覆盖var foo您在该函数中定义的全局变量。

关于ES6,

function example(x) {
    console.log(y); // ReferenceError: y is not defined
    if (x) {
        let y = 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

let语句声明的变量被创建为当前执行上下文的词法环境(而不是变量环境)上的绑定。ES6中对块语句规范的更改意味着每个块都有其自己的词汇环境。在上面的示例中,当评估块(if语句的主体)时,将创建一个新的词汇环境。当评估let语句时,绑定将添加到此词法环境,并且无法从外部词法环境(函数声明本身的词法环境)访问绑定。

参考

  • 根据上下文,“LexicalEnvironment”将具有多个“[[scope]]”。 (2认同)
  • 抱歉,ES6 中每个块都有自己的词法环境。更新了我的答案 (2认同)