Javascriptで実行コンテキストの状態を特定するためにVariableEnvironmentが必要なのはなぜですか?
ECMAScript仕様では、次のように述べられています。
LexicalEnvironment:
この実行コンテキスト内でコードによって行われた識別子参照を解決するために使用されるレキシカル環境を識別します。
また、
実行コンテキストの LexicalEnvironment コンポーネントと VariableEnvironment コンポーネントは常に Lexical Environment です。
そしてそれ:
通常、Lexical環境は、FunctionDeclaration、BlockStatement、またはtrystatementのCatch句などのECMAScriptコードの特定の構文構造に関連付けられ、そのようなコードが評価されるたびに新しいLexical Environmentが作成されます。
問題は、LexicalEnvironmentが変数値バインディングを追跡するのに十分であるように見えるので、最初にVariableEnvironmentが必要なのはなぜですか?
さて、JavaScriptのこのコード例を見てみましょう[コメントの質問]:
function x(b){
var c = 2;
// During the creation phase of the excution context of the function
// the ifStatement Block will it be skipped?
if(c >= 1){
let d = 3;
// Does e belongs to the Lexical Environment of the IfStatementBlock or to the FunctionDeclaration?
var e = 4;
a = 5;
}
}
VariableEnvironmentは関数全体にスコープされている名前に使用されますが、LexicalEnvironmentは最も近い囲みブロック(EcmaScript 6のletおよびconst宣言)にスコープされている名前に使用されます。
あなたの例では、cとeはどちらも関数のVariableEnvironmentに属しています。 var宣言は関数の先頭に掲げられますが、eブロックが入力されない限り、ifは初期化されません。したがって、次のようになります。
function x(b) {
var c = 2;
var e;
if (c >= 1) {
let d = 3;
e = 4;
a = 5;
}
}
source