Javascriptで実行コンテキストの状態を特定するためにVariableEnvironmentが必要なのはなぜですか?

Javascriptで実行コンテキストの状態を特定するためにVariableEnvironmentが必要なのはなぜですか?

タグ:

質問

ECMAScript仕様では、次のように述べられています。

LexicalEnvironment:

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

また、

実行コンテキストの LexicalEnvironment コンポーネントと VariableEnvironment コンポーネントは常に Lexical Environment です。

そしてそれ:

通常、Lexical環境は、FunctionDeclaration、BlockStatement、またはtrystatementのCatch句などのECMAScriptコードの特定の構文構造に関連付けられ、そのようなコードが評価されるたびに新しいLexical Environmentが作成されます。

問題は、LexicalEnvironmentが変数値バインディングを追跡するのに十分であるように見えるので、最初にVariableEnvironmentが必要なのはなぜですか?

さて、JavaScriptのこのコード例を見てみましょう[コメントの質問]:

var a = 1;
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は初期化されません。したがって、次のようになります。

var a = 1;

function x(b) {
var c = 2;
var e;
if (c >= 1) {
let d = 3;
e = 4;
a = 5;
}
}




source
特定のゴルーチンを実行するためにtime.sleepが必要なのはなぜですか?
Javascript:特定のコンテキストでコードを実行する
反応コンテキストにプロバイダが必要なのはなぜですか?
Javascriptでこれのコンテキストを失うのはなぜですか?
なぜ状態管理のために突然変異、セッター、ゲッターが必要なのですか?
Region.IsEmpty()にGraphicsコンテキストが必要なのはなぜですか?
JavaScriptでTypeScriptクラスを使用するために `.default`が必要なのはなぜですか?
なぜ状態モナドでフラットマップが必要なのですか?
iOSでは、なぜUIBezierPath描画にコンテキストが必要ないのですか?
Spring MVCに少なくとも2つのコンテキストが必要なのはなぜですか?
Rating