1

クロージャーについてスタックオーバーフローで多くの例と質問を読みましたが、完全に理解できていないように感じます。ここに私が得るすべてがあります:

function testClosure (s1,s2){
    return function(s3){
        return s1 +' '+ s2 +' '+s3;
    }
}

var t1 = testClosure("test","test2");


console.log(t1("test3")); //test test2 test3
  1. t1 は、関数とスコープ チェーンを保持しています。testClosure();
  2. t1 は無名関数を単独で返しています。
  3. t1 が呼び出されるとtestClosure();、最後の引数を受け入れるために内部関数が配置されます。
  4. s1、s2、s3 は、スコープ チェーンを介したルックアップであり、戻ります。

私の理解は間違っていますか?

4

2 に答える 2

2
  1. あなたは実行しtestClosureます。
  2. testClosure新しい関数を作成して返します。関数は別の関数の内部で作成されるため、クロージャーが作成され、新しい関数のスコープ チェーンに追加されます。testClosureクロージャーは、作成時に渡された引数にアクセスできます。
  3. variablet1には、返された関数がその値として割り当てられます。
  4. 引数を呼び出しt1て渡します。内部でt1は、クロージャーの一部である引数を参照します。
  5. t1現在のコンテキストではこれらの値を見つけることができないため、スコープ チェーン内の次のスコープ (クロージャー) を調べます。
  6. t1値を見つけて実行を終了します。
于 2013-07-21T18:37:32.610 に答える
0
  1. testClosureは、2 つの引数を受け入れて無名関数を返す名前付き関数を呼び出し、t1 を無名関数に設定します。

t1 は、呼び出すことができ、1 つの引数を受け入れる無名関数になりました。t1 が呼び出されると、name 関数と無名関数から文字列 param 引数を作成し、結果を返します。

名前付き関数 testClosure を呼び出すたびに、クロージャーが作成されます。匿名関数を呼び出すと、囲まれた名前の関数文字列パラメーターにアクセスし、3 つのパラメーターすべてを構築された string として返します。


JS のクロージャは、JavaScript が提供する最も強力な実装の 1 つです。実装する方法と場所、または閉鎖が必要な場所の学習は、一定期間の赤ちゃんのステップによって学習されます。

JavaScript ライブラリが大きくなればなるほど、クロージャが必要になります。

クロージャーを使用すると、特定のデータを他のコンテキストの手が届かないコンテキストに置くことができます。私はクロージャーを他のどこよりもループ内で使用していることに気づきました。

ほとんどの場合、無名関数とクロージャーは連携して機能します。クロージャーを学ぶ最善の方法は、クロージャーについて毎日少しずつ学び続けることです。そうすれば、クロージャーが必要な状況に陥ったときに、最終的にそれを得ることができます。

以下は、リモート サーバー上のフォト アルバムに対して AJAX 呼び出しを行っている例です。AJAX 呼び出しの成功関数は、アルバムの写真の配列を保持します。ループごとに、無名関数を返す名前関数を呼び出しています。ボタンクリックイベントに無名関数を設定します。

DOM に追加されたすべての新しいボタンは、囲まれた独自の URL 文字列パラメーターにアクセスできます。

優れた JavaScript プログラマーになるには、クロージャーを学び、理解することが不可欠です。

function testClosure(url) {

    return function (ev) {

        document.getElementById('myImg').url = url || 'http://www.dummyurl/dummy.png';
    }
}

$.ajax({
    type: "post",
    url: "http://www.myurl.com",
    data: 'photoalbum' = 45,
    dataType: "json",
    success: function (photos) {

        for (var i = 0; i < photos.length; i++) {

            var btn = document.createElement('input');
            btn.type = 'button';
            btn.onclick = testClosure(photos[i].url);

            document.body.appendChild(btn);

        };
    }
});
于 2013-07-21T18:53:21.790 に答える