これらは実行コンテキストに存在するため、これら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)
})();
})();