6

これらは実行コンテキストに存在するため、これら2つの違いを誰かが明確にすることはできますか? ECMA 262 v 5の仕様を読んで違いをはっきりと理解するのは難しいです。

ありがとうございました、

4

2 に答える 2

9

どちらも実行コンテキストの (同じタイプの) コンポーネントですが、(仕様から)異なる目的を果たします。

レキシカル環境

Lexical Environmentこの実行コンテキスト内でコードによって行われた識別子参照を解決するために使用される を識別します。

変数環境

Lexical Environmentこの実行コンテキスト内で VariableStatements および FunctionDeclarations によって作成されたバインディングを保持する環境レコードを持つ を識別します。

次の段落では、異なる必要がある理由を説明します。

実行コンテキストが作成されると、その LexicalEnvironment コンポーネントと VariableEnvironment コンポーネントは最初は同じ値を持ちます。VariableEnvironment コンポーネントの値は変更されませんが、LexicalEnvironment コンポーネントの値は実行コンテキスト内でのコードの実行中に変更される可能性があります。

これは頻繁には発生せず、通常は両方とも同じ を参照しLexical Environmentます。LexicalEnvironment の変更の良い例は、なぜ catch 句に独自の字句環境があるのか​​という質問に示されています。- §12.14を参照してください。これが発生する仕様で見つけることができる他の場所はWith Statements( §12.10 ) Object Environment Record、識別子の解決に an が動的に使用される場所ですが、変数/関数の宣言は静的です。

于 2013-02-24T17:19:58.790 に答える
4

私が理解している限り、これらは同じタイプのエンティティ (レキシカル環境) を参照するために使用される単なる異なる名前です。目的が異なるため、名前が異なります。

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)

  })();

})();
于 2013-02-24T17:06:27.523 に答える