「ホイスティングとは、コード実行前のコンパイル段階で、すべての変数と関数の宣言が含まれるスコープの先頭に移動する JavaScript の動作です。」
この定義はどこでも見かけるかもしれませんが、「すべての変数と関数の宣言が物理的にコードの先頭にあるというのは迷信です。」これは真実ではありません!
しかし、代わりに、すべての変数と関数のホイスティングで、コンパイルでコードを実行する前にメモリが割り当てられており、入力した場所に正確に保持されます。
var/let/const と関数がどのようにホイストされるのかを正確に説明します。
ここにいくつかの例があります:
console.log(a) // undefined console.log(b) // ReferenceError console.log(c) // ReferenceError var a = 10; let b = 20; const c = 30;
var で宣言された変数はホイストされ、コンパイル時に var 変数に値が未定義でメモリに割り当てられます。なぜ宣言前に var をコンソールすると unknown になるのですか
const/let で宣言された変数もホイストされますが、 unknown では初期化されません。宣言する前にアクセスすることはできません。そうでない場合は、ReferenceError が返されます。これは、変数が存在しても初期化されていない時間的デッド ゾーンが原因です。
しかし、関数についてはどうでしょうか
それは関数をどのように宣言するかによって決まります。以下を参照してください。
greet1(); greet2(); greet3(); greet4(); //function declaration is full hoisted function greet1(){ console.log("greet1"); } // TypeError: greet2 is not a function var greet2 = function(){ console.log("greet2"); } // ReferenceError: Cannot access 'greet3' before initialization let greet3 = function(){ console.log("greet2"); } // ReferenceError: Cannot access 'greet4' before initialization const greet4 = function(){ console.log("greet2"); }
従来の関数宣言は完全にホイストされているため、コード全体で呼び出すことができます。
しかし、関数式では、それが宣言される前にそれを行うことはできません。これが、変数を使用して宣言された 3 つの関数でエラーが発生する理由です。したがって、関数式を関数宣言に変更するか、宣言の後に関数を呼び出すかの 2 つのオプションがあります。
以上がJavaScriptでホイスティング?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。