これらは実行コンテキストに存在するため、これら2つの違いを誰かが明確にすることはできますか? ECMA 262 v 5の仕様を読んで違いをはっきりと理解するのは難しいです。
ありがとうございました、
これらは実行コンテキストに存在するため、これら2つの違いを誰かが明確にすることはできますか? ECMA 262 v 5の仕様を読んで違いをはっきりと理解するのは難しいです。
ありがとうございました、
どちらも実行コンテキストの (同じタイプの) コンポーネントですが、(仕様から)異なる目的を果たします。
レキシカル環境
Lexical Environment
この実行コンテキスト内でコードによって行われた識別子参照を解決するために使用される を識別します。
変数環境
Lexical Environment
この実行コンテキスト内で VariableStatements および FunctionDeclarations によって作成されたバインディングを保持する環境レコードを持つ を識別します。
次の段落では、異なる必要がある理由を説明します。
実行コンテキストが作成されると、その LexicalEnvironment コンポーネントと VariableEnvironment コンポーネントは最初は同じ値を持ちます。VariableEnvironment コンポーネントの値は変更されませんが、LexicalEnvironment コンポーネントの値は実行コンテキスト内でのコードの実行中に変更される可能性があります。
これは頻繁には発生せず、通常は両方とも同じ を参照しLexical Environment
ます。LexicalEnvironment の変更の良い例は、なぜ catch 句に独自の字句環境があるのかという質問に示されています。- §12.14を参照してください。これが発生する仕様で見つけることができる他の場所はWith Statements
( §12.10 ) Object Environment Record
、識別子の解決に an が動的に使用される場所ですが、変数/関数の宣言は静的です。
私が理解している限り、これらは同じタイプのエンティティ (レキシカル環境) を参照するために使用される単なる異なる名前です。目的が異なるため、名前が異なります。
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)
})();
})();