Javascriptの巻き上げとグローバルスコープの宣言
Aug 21 2020
javascriptでは、コンパイルフェーズですべての宣言が検索され、適切なスコープに関連付けられます。
ケース1
a = 2;
console.log(a);
厳密モードで使用されない場合、スニペットは実際には次のように処理されると見なされます。
var a;
a = 2;
console.log(a);
出力:2
CASE2
宣言がconsole.log()の下で発生した場合
console.log(a);
var a = 2;
ここで1行目:コンパイラはスコープ内のaの宣言が見つからない場合はチェックし、グローバルスコープは1つを割り当て、同じコードが再び同じと見なされます。
var a;
console.log(a);
a = 2;
出力:未定義//インタプリタ読み取りコンソール中に値が割り当てられていないため
CASE3
console.log(a);
a = 2;
出力:RefErr
なぜこれは参照エラーをスローし、未定義ではないのですか?
回答
1 AbhishekJain Aug 21 2020 at 14:19
最初の2つのケースを注意深く見ると、常に変数を宣言していることa
になり、JavaScriptでは宣言のみが引き上げられます。
そうは言っても、あなたのCase 3
変数a
は決して宣言されないので、ここでは巻き上げることはできません。これによりa
、スコープ内に名前による変数がないため、ReferenceError
。
ReferenceErrorの説明を見ると、次のようになっています。
ReferenceErrorオブジェクトは、存在しない変数が参照された場合のエラーを表します。
1 Quentin Aug 21 2020 at 14:12
暗黙のグローバルはvar
ステートメントを意味しません。それらの巻き上げはありません。