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

JavaScript で匿名関数がクロージャになるのはいつですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-31 08:05:021062ブラウズ

When Does an Anonymous Function Become a Closure in JavaScript?

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 サイトの他の関連記事を参照してください。

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