JavaScript クロージャと匿名関数
JavaScript の一般的な機能である匿名関数は、クロージャの議論でよく取り上げられます。ただし、すべての匿名関数が真のクロージャとして認定されるわけではありません。
クロージャの定義
JavaScript のクロージャは、字句スコープへのアクセスを保持する特殊なタイプの匿名関数です。これは、外側のスコープが終了した後でも作成されたものです。この機能により、クロージャは外部スコープから変数の値を「キャプチャ」し、変数がガベージ コレクションされるのを防ぎます。
ケース スタディ: 変数のクローズ
In指定されたコード例では、どちらのソリューションも匿名関数を使用してカウンター変数 i の出力を遅らせます。
Friend's Attempt
最初の例のコードは、 i はクロージャ内の変数です。ただし、内部の匿名関数 g は外部関数 f の字句スコープを継承しないため、クロージャの定義を満たしません。したがって、i は実際には「クローズ オーバー」ではありません。
<code class="javascript">for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); }</code>
編集者の試み
2 番目のコード例は実際にクロージャを作成します。外部関数 f によって返される匿名関数は、i2 変数をキャプチャし、その値をクロージャの字句スコープ内に保存します。次に、このクロージャが setTimeout コールバック内で呼び出され、i 変数の元の値が確実にアクセスされるようにします。
<code class="javascript">for(var i = 0; i < 10; i++) { setTimeout((function(i2){ return function() { console.log(i2); } })(i), 1000); }</code>
結論
提供されたコードでは、エディターのソリューションは、変数 i の値を取得するためのクロージャの正しい使用方法を示しています。どちらのソリューションも印刷遅延の問題を効果的に解決しますが、技術的な意味でクロージャとして適格なのは編集者のソリューションのみです。
以上がJavaScript で匿名関数がクロージャになるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。