清晰地了解ECMAScript/JavaScript中"LexicalEnvironment"和"VariableEnvironment"之间的区别

con*_*att 6 javascript ecma262 ecmascript-5

有人可以澄清这两者之间的区别,因为它们存在于执行环境中吗?我很难阅读ECMA 262 v 5规范并清楚地看到差异.

谢谢,

Ber*_*rgi 9

两者都是执行上下文的组件(相同类型),但它们用于不同的目的(来自规范):

LexicalEnvironment

标识Lexical Environment用于解析此执行上下文中的代码所做的标识符引用.

VariableEnvironment

标识Lexical Environment其环境记录包含由此执行上下文中的VariableStatements和FunctionDeclarations创建的绑定.

下一段解释了为什么它们需要不同:

创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值.在执行上下文中执行代码期间,LexicalEnvironment组件的值可能会更改,VariableEnvironment组件的值永远不会更改.

这种情况不会经常发生,通常都是指相同的Lexical Environment.在为什么catch子句有自己的词汇环境的问题中给出了改变LexicalEnvironment的一个很好的例子- 见§12.14.我可以在规范中找到的另一个地方是With Statements(§12.10),其中a Object Environment Record动态地用于标识符解析 - 但变量/函数声明是静态的.