ホームページ  >  記事  >  ウェブフロントエンド  >  同様の例は機能するのに、この JavaScript コードが失敗するのはなぜですか?

同様の例は機能するのに、この JavaScript コードが失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 07:59:29461ブラウズ

Why Does This JavaScript Code Fail, Even Though Similar Examples Work?

JavaScript 関数の宣言と評価順序

背景:

JavaScript では、関数を次のように指定できます。式を使用して宣言または作成されます。関数宣言はコンパイル フェーズで行われ、関数式は実行フェーズで評価されます。この違いを理解することは、JavaScript コードの動作を理解するために重要です。

質問:

次のコード ブロックの最初の例はなぜ失敗するのに、残りの例は失敗するのですか?正常に実行されましたか?

<code class="javascript">// 1 - does not work
(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();

// ... other examples</code>

答え:

最初の例の失敗は、スコープやクロージャの問題ではなく、宣言と式の間の誤解によるものです。 .

関数宣言と式:

  • 関数 宣言 は、関数名 (引数) {code}
  • 関数
  • は関数宣言と同様に式として記述されますが、実行時に評価されます。

フェーズ 1: コンパイル

コンパイル中に、コンパイラーは関数宣言を処理し、関数の変数を作成します。最初の例では、変数 someFunction1 が作成されますが、その値 (関数本体) が後で評価されるため未定義のままです。

フェーズ 2: 実行

例 1:

実行時に、インタープリターは setTimeout(someFunction1, 10) に遭遇し、未定義の someFunction1 を setTimeout に渡そうとします。

例 2:

対照的に、関数 someFunction2() は宣言であり、コンパイル中に関数を作成します。 setTimeout が呼び出されると、コンパイルされた関数参照を受け取ります。

例 3:

ここでは、匿名関数が setTimeout に渡され、変数へのクロージャが作成されます。何らかの機能3. setTimeout がトリガーされると、someFunction3 に値が割り当てられ、関数は正常に実行されます。

例 4:

例 2 と同様に、関数 someFunction4 が宣言され、次のようになります。その参照は setTimeout で利用できます。

追加の説明:

    JavaScript の関数引数は、プリミティブ型の場合は値によって、オブジェクトの場合は参照によって渡されます。これは、setTimeout が someFunction へのクロージャを受け取らないことを意味します。
  • JavaScript コードの動作を予測するには、宣言と式の区別を理解することが重要です。

以上が同様の例は機能するのに、この JavaScript コードが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。