JavaScript のクロージャーは、一部の開発者にとって混乱の対象となっています。すべての JavaScript 関数はクロージャですが、特定のサブセットが特に理論的に興味深いものです。この記事は、概念を明確にし、2 つのコード ブロックのうちどちらがクロージャを正確に利用しているかを判断することを目的としています。
クロージャについて:
クロージャは、へのアクセスをキャプチャして維持する関数です。スコープがアクティブでなくなった後でも、そのスコープを囲んでいるスコープから変数を削除します。本質的に、クロージャはメモリを持ち、「親スコープ変数」または「上位値」として知られる親スコープからデータにアクセスできる関数です。
クロージャの識別:
関数がクロージャであるかどうかを判断するには、その変数を調べる必要があります。非ローカル変数 (つまり、自由に変更できる変数) を持たない関数はクロージャになることができません。非ローカル変数を持つ関数は、クロージャになるために親スコープの外から参照される必要があります。
ケース 1: 友達のプログラム
<code class="javascript">for(var i = 0; i < 10; i++) { (function(){ var i2 = i; setTimeout(function(){ console.log(i2); }, 1000) })(); }</code>
この場合、関数はは閉じられた親スコープ変数がないため、クロージャではありません。ただし、setTimeout に渡される内部関数は、自由変数 i2 へのアクセスをキャプチャして維持するため、クロージャです。
ケース 2: 作成者のプログラム
<code class="javascript">for(var i = 0; i < 10; i++) { setTimeout((function(i2){ return function() { console.log(i2); } })(i), 1000); }</code>
こちら、内部関数は自由変数 i2 へのアクセスを維持し、親スコープの外で参照された場合でもクロージャのままです。
結論:
どちらの場合も、クロージャが利用されます。 。著者のプログラムは、i の値を適切に取得するためにクロージャを採用しています。別の関数を返し、それを setTimeout に渡すことによって、内部関数はクローズドオーバー変数 i2 にアクセスできます。これにより、遅延後に正しい値がコンソールに出力されます。
以上がJavaScript では匿名関数は常にクロージャになりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。