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ステートメントを意味しません。それらの巻き上げはありません。