ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript クロージャと匿名関数の違いは何ですか?

JavaScript クロージャと匿名関数の違いは何ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-29 18:18:45787ブラウズ

What's the difference between JavaScript closures and anonymous functions?

JavaScript クロージャと匿名関数

クロージャは JavaScript の重要な概念であり、関数がそれを囲んでいるスコープから変数にアクセスできるようにします。関数が呼び出されます。ただし、クロージャと匿名関数を区別することが重要です。

ループと setTimeout を使用してカウンタ変数のロギングを遅らせるという一般的な例を考えてみましょう。クロージャを利用しないと、コードは最終値を複数回出力します。

クロージャの不正な使用法:

for (var i = 0; i < 10; i++) {
  setTimeout(function() {
    console.log(i); // This incorrectly prints 10 for each iteration
  }, 1000);
}

ここでの問題は、匿名関数が最終値を出力しないことです。反復ごとに i の値を取得します。代わりに、グローバル スコープ内の i への参照をキャプチャし、最終的に最終値 10 に達します。

正しいクロージャの使用法:

for (var i = 0; i < 10; i++) {
  (function() {
    var i2 = i;
    setTimeout(function() {
      console.log(i2); // This correctly prints 0 to 9 with delay
    }, 1000);
  })();
}

この場合、匿名関数は新しい変数 i2 を作成し、これは i の現在の値で初期化されます。次に、内部の匿名関数が i2 の値を取得してロギングに使用するため、元の反復の値が保持されます。

クロージャと匿名関数の区別:

JavaScript のすべての関数は技術的には変数を「クローズオーバー」しますが、「クロージャ」という用語は通常、次のような関数に対して予約されています。

  • 外部スコープ (つまり、非ローカルまたは " free" 変数)
  • 定義されているスコープの外側から参照されている (つまり、自由変数の周囲が「閉じられている」)

最初の例では、匿名関数は変数 i をキャプチャしないため、これらの基準を満たしません。 2 番目の例では、匿名関数はこれらの条件を満たしているため、クロージャとみなされます。

結論:

クロージャと匿名関数の区別を理解することは、 JavaScript の力を効果的に活用します。クロージャを使用すると、関数がその外側のスコープと対話できるようになり、カプセル化が提供され、変数への遅延アクセスが可能になります。これは、非同期操作やイベント処理に特に有益です。

以上がJavaScript クロージャと匿名関数の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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