可能有人澄清所不同的是这两者之间有什么,因为他们在执行方面存在吗? 这是我很难阅读ECMA 262 V,5规范和清晰的看到差别。
谢谢,
可能有人澄清所不同的是这两者之间有什么,因为他们在执行方面存在吗? 这是我很难阅读ECMA 262 V,5规范和清晰的看到差别。
谢谢,
两者都是执行上下文的(同一类型的)组件,但它们用于不同的目的( 从规格 ):
LexicalEnvironment
标识
Lexical Environment
用来解决此执行上下文中通过代码所做标识符的引用。
VariableEnvironment
标识
Lexical Environment
,其环境记录持有该执行上下文内VariableStatements和FunctionDeclarations创建绑定。
接下来的一段解释了为什么他们需要的是不同的:
当一个执行上下文中创建其LexicalEnvironment和VariableEnvironment部件最初具有相同的值 。 所述VariableEnvironment分量的值不会改变而LexicalEnvironment分量的值可以执行上下文内的代码执行期间发生变化 。
这并不经常发生,通常都是指同一个Lexical Environment
。 为改变LexicalEnvironment一个很好的例子在这个问题给出了为什么catch子句有自己的词汇环境? -见§12.14 。 其他的地方我能找到在发生这种情况的规范是With Statements
( §12.10 ),其中一个Object Environment Record
动态用于标识解析-但变量/函数声明是静态的。
据我了解,这些都是用来指同一类型的实体(词法环境)只是叫法不同。 他们因不同的目的而有不同的名称。
LexicalEnvironment
用来同时解决标识符VariableEnvironment
用于声明变量和函数。
两者都引用的词法环境(=环境记录+可选的外词法环境;又名范围链),其对每一个执行上下文创建。
执行上下文的LexicalEnvironment和VariableEnvironment组件总是词法环境。 当一个执行上下文中创建其LexicalEnvironment和VariableEnvironment部件最初具有相同的值。 所述VariableEnvironment分量的值不会改变而LexicalEnvironment分量的值可以由在代码执行过程的执行上下文内改变
实施例中的伪代码:
// VariableEnvironment (global) = { __outer__: null }
// LexicalEnvironment = VariableEnvironment (global)
(function foo() {
// VariableEnvironment (A) = { x: undefined, __outer__: global }
// LexicalEnvironment = VariableEnvironment (A)
var x;
(function bar(){
// VariableEnvironment (B) = { y: undefined, __outer__: A }
// LexicalEnvironment = VariableEnvironment (B)
var y;
x = 2;
// VariableEnvironment (A) = { x: 2, __outer__: global }
// LexicalEnvironment is still the same as VariableEnvironment (B)
})();
})();