两年前在SO上发布了一个类似的问题Clarity on the difference between “LexicalEnvironment” and “VariableEnvironment” in ECMAScript/JavaScript,但它基于ES5。
我现在正在学习ES6,并遇到了一些有趣的事实。例如,在块作用域中,您不能多次使用let
声明一个变量。
// you can declare a variable with var multiple times
var a = 1;
var a = 2;
a; // => 2
// but you can't do that with let
{
let a = 1;
let a = 2; // => Error
}
所以我提到了ES6 draft,有些句子引起了我的注意:
让和 const 声明定义范围限定为正在运行的执行上下文的LexicalEnvironment的变量。
var 语句声明了作用于正在运行的执行上下文的VariableEnvironment的变量。
好好考虑一下:
// in global execution context
{
let a = 1;
var b = 2;
}
console.log(a); // => ReferenceError: a is not defined
console.log(b); // => 2
众所周知,let
声明会限制块中变量的范围,但我们应该如何理解短语**let** and **const** declarations define variables that are scoped to the running execution context’s LexicalEnvironment.
?
LexicalEnvironment是否与块有关?