Javascript 什么';这两者之间的区别是什么;词汇环境“;及;“可变环境”;符合规格

Javascript 什么';这两者之间的区别是什么;词汇环境“;及;“可变环境”;符合规格,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在阅读,术语“词汇环境”和“可变环境”被多次使用。它们的定义见表23: LexicalEnvironment:标识用于解析代码在此执行上下文中进行的标识符引用的词汇环境 VariableEnvironment:标识其EnvironmentRecord保存在此执行上下文中由VariableStatements创建的绑定的词汇环境 执行上下文的词汇环境和可变环境组件总是词汇环境。创建执行上下文时,其词典环境和VariableEnvironment组件最初具有相同的值 所以,我想知道它们会有什么不

我正在阅读,术语“词汇环境”和“可变环境”被多次使用。它们的定义见表23:

LexicalEnvironment:标识用于解析代码在此执行上下文中进行的标识符引用的词汇环境

VariableEnvironment:标识其EnvironmentRecord保存在此执行上下文中由VariableStatements创建的绑定的词汇环境

执行上下文的词汇环境和可变环境组件总是词汇环境。创建执行上下文时,其词典环境和VariableEnvironment组件最初具有相同的值


所以,我想知道它们会有什么不同,以及在哪些情况下使用它们。有人能解释一下吗?

这很难。我将尝试用一些简单的例子来解释。因此,在这个问题中,一件重要的事情是理解
执行上下文

词汇环境

意味着你在代码中写东西的位置很重要。并不是所有的编程语言都是这样的,但是javascript是这样的

如果你有一个函数,比如

function hello() {
    var myVar = 'hello';
}
现在变量
myVar
在词汇上位于函数内部。这就是您正在编写的代码。 简而言之,如果谈论
词汇环境
意味着它是在哪里写的,以及它的周围是什么

多变的环境 每次调用函数时,都会创建一个新的执行上下文。因此,即使myVar声明了3次(见下一个示例),它们也不会相互接触。这就是您所谈论的
可变环境

函数b(){
var-myVar;
console.log('three',myVar)//三个未定义
//原因myVar是在b()中新声明的
//但是没有价值
}
函数a(){
var-myVar=2;
console.log('two',myVar)//two 2
b();
}
var-myVar=1;
console.log('one',myVar)//one 1
a();
console.log('four',myVar)//one 1
我在github上发布到官方ECMA262组织,这是littledan的答案:

LexicalEnvironment是一个局部词法范围,例如,用于let定义的变量。如果在catch块中定义一个带有let的变量,那么它只在catch块中可见,为了在规范中实现它,我们使用了LexicalEnvironment。VariableEnvironment是var定义变量之类的范围。VAR可以被认为是“提升”到函数顶部。为了在规范中实现这一点,我们给函数一个新的VariableEnvironment,但是说块继承了封闭的VariableEnvironment


可能的副本?他们的目的并没有真正改变,只是当前的词汇环境被更频繁地交换(例如,每个块作用域)。是的,我以前读过,但我仍然有一些问题。您说过
尝试{throw“some”}catch(x){function y(){console.log(x,typeof x);}y();}
,我在chrome中运行它,但没有
为x抛出引用错误Bergi@SmallTownNE谢谢,我更新了。但是“有趣的事实”并不是这篇文章的主旨——主要的一点是,当你进入一个块范围时,词汇环境会发生变化(例如,
catch
,因为ES6也是普通块——对于
let
const
等),谢谢。我还有一些问题。我可以总结一下,
LexicalEnvironment
是静态的,
VariableEnvironment
是动态的吗?(因为我读了@Bergi您认为
VariableEnvironment
在同一执行上下文中从不更改。但请表示
LexicalEnvironment
在同一执行上下文中从不更改。这让我感到困惑。您能解释一下吗?@贝吉