6

JS/JQuery と匿名関数とクロージャーについて学んでいます。次のような例を見てきました。

$('.button').click(function(){
    /* Animations */
    /* Other Stuff */
});

ボタンが複数あると効率悪くないですか?それは、無名関数のプロトタイプの同様のコピーをメモリに格納しているだけではありませんか? (私の用語を修正してください)これを行う方が良いでしょうか:

function handleClick(){
    /* Animations */
    /* Other Stuff */
}

('.button').click(handleClick);

または、ボタンへの参照が必要な場合は、次のようにします。

function handleClick($obj){
    /* Animations */
    /* Other Stuff */
}
//multiple anon functions again, but they all reference ONE handleClick function
('.button').click((function($obj){         
     return function(){handleClick($obj)};
})($(this));
4

2 に答える 2

3

名前付き関数を使用する場合、それはグローバルクロージャーにのみ存在しますが、実行時に関数を定義すると、それらは新しいクロージャー (親関数のクロージャー) 内に作成され、その結果、親変数が必要ない場合でも保持されます。もう機能しません。

簡単に言えば、親関数にある変数にアクセスする必要がある場合にのみ、匿名関数を試してください。匿名関数は、ほとんどの場合、名前付き関数よりも高価です。しかし、グローバルクロージャーで定義された名前付き関数は、グローバル名前空間を汚染し、自分で決定します。

于 2013-09-06T11:39:38.040 に答える
2

設計上、オブザーバー パターンはオブザーバーのインスタンスを 1 つだけ保持します。次に、イベント ハンドラは、イベント パラメータを保持するイベント オブジェクトの他のインスタンスを使用して、このオブザーバを複数回呼び出します: どの要素がイベントを起動したか、コンテキストは何かなど。

したがって、ハンドラーは複製されませんが、各サブジェクトの「リスナー ストア」で参照されます。

注:
Kemal Dag は、定義上、名前付き関数よりも匿名関数の方がパフォーマンスが低いことにも注意しています。それが本当かどうかはわかりませんが、そうである場合、違いはごくわずかです。特に、anon 関数を広範囲に使用する JavaScript などの言語の場合、パフォーマンスへの影響を与える余裕はありません。

于 2013-09-06T11:38:25.367 に答える