0

渡されたパラメーターを使用して匿名関数が呼び出されるたびに、これは本質的に匿名関数内のすべてをパックし、最初の匿名関数がデータベースまたは ajax 呼び出しからコールバックされる前にサブスクライブされた関数への別の呼び出しが呼び出された場合、それは前の無名関数には影響せず、呼び出されている現在の無名関数は新しいクロージャーを作成するだけで、新しい各無名クロージャーのすべてのデータは次のクロージャーまたは前のクロージャーに影響しませんか?

       this.subscribe.call(this, e.horizontaladded, function (a, fn) {

            if (!a.extra.owner.id) { return; };

       (function (a) {


                dataBase.insert(
                    dbPart(
                    ['horizontal?a=', a.extra.owner.instanceName, '&id=', a.extra.owner.id].join(''),
                    a.target
                    ),
                    dbCB(success, error)
                );


                function success(data, status) {

                    if (status === 'error') { return; };

                     console.log('Horizontal Added');


                    a.target.id = data.id,
                    a.target.HTML().addClass('alum_' + data.id),
                    a.target.finish.id = data.finishID,
                    a.target.size.id = data.sizeID,
                    a.target.siteLine.id = data.sitelineID;


            }(a));

   }, true);

つまり、e.horizo​​ntaladded に呼び出される呼び出しごとに、新しい匿名関数が呼び出されるたびに呼び出され、それ自体のすべての個人データで閉じられ、ガベージ コレクションによってすべてのクロージャーがクリーンアップされますか?

したがって、私がサブスクライブしているこの関数の場合、30 回の horizo​​ntaladded 呼び出しが行われ、30 個のクロージャーが作成された場合、データベースの成功がコールバックされたときにクロージャーは自分自身をクリーンアップしますか?

4

1 に答える 1

1

クロージャ内の変数に到達する可能性のあるコードがない場合、クロージャはガベージ コレクタによってクリーンアップされます。

実際、クロージャーは、ガベージ コレクター内で、javascript 内の他のオブジェクトと同じように機能します。誰もその中に何かへの参照を持っていない場合、ガベージ コレクターはそれを自由にクリーンアップできます。

特定の例では、すぐに呼び出される関数式は、他のコードがクロージャー内の何かへの参照を持っている限り続くクロージャーを作成します。そのため、関数のdatabase.insert()実行が開始されると、関数への参照がありsuccess()、クロージャーが存続します。終了して関数を呼び出すと、呼び出し後に関数success()への参照がクリアされるためsuccess()、クロージャー内の何かへの参照が解放されます。ガベージ コレクターは、そのクロージャー内に他の参照が見つからない場合、クロージャーを解放します。

于 2013-06-02T01:13:02.963 に答える