清晰度上的ECMAScript / JavaScript的“LexicalEnvironment”和

2019-07-20 09:53发布

可能有人澄清所不同的是这两者之间有什么,因为他们在执行方面存在吗? 这是我很难阅读ECMA 262 V,5规范和清晰的看到差别。

谢谢,

Answer 1:

两者都是执行上下文的(同一类型的)组件,但它们用于不同的目的( 从规格 ):

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动态用于标识解析-但变量/函数声明是静态的。



Answer 2:

据我了解,这些都是用来指同一类型的实体(词法环境)只是叫法不同。 他们因不同的目的而有不同的名称。

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)

  })();

})();


文章来源: Clarity on the difference between “LexicalEnvironment” and “VariableEnvironment” in ECMAScript/JavaScript