JavaScript 関数の宣言と評価順序
背景:
JavaScript では、関数を次のように指定できます。式を使用して宣言または作成されます。関数宣言はコンパイル フェーズで行われ、関数式は実行フェーズで評価されます。この違いを理解することは、JavaScript コードの動作を理解するために重要です。
質問:
次のコード ブロックの最初の例はなぜ失敗するのに、残りの例は失敗するのですか?正常に実行されましたか?
<code class="javascript">// 1 - does not work (function() { setTimeout(someFunction1, 10); var someFunction1 = function() { alert('here1'); }; })(); // ... other examples</code>
答え:
最初の例の失敗は、スコープやクロージャの問題ではなく、宣言と式の間の誤解によるものです。 .
関数宣言と式:
フェーズ 1: コンパイル
コンパイル中に、コンパイラーは関数宣言を処理し、関数の変数を作成します。最初の例では、変数 someFunction1 が作成されますが、その値 (関数本体) が後で評価されるため未定義のままです。フェーズ 2: 実行
例 1:
実行時に、インタープリターは setTimeout(someFunction1, 10) に遭遇し、未定義の someFunction1 を setTimeout に渡そうとします。例 2:
対照的に、関数 someFunction2() は宣言であり、コンパイル中に関数を作成します。 setTimeout が呼び出されると、コンパイルされた関数参照を受け取ります。例 3:
ここでは、匿名関数が setTimeout に渡され、変数へのクロージャが作成されます。何らかの機能3. setTimeout がトリガーされると、someFunction3 に値が割り当てられ、関数は正常に実行されます。例 4:
例 2 と同様に、関数 someFunction4 が宣言され、次のようになります。その参照は setTimeout で利用できます。追加の説明:
以上が同様の例は機能するのに、この JavaScript コードが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。