2013-09-06 10 views
6

JS/JQueryと匿名関数とクロージャについて学習しています。私はこのような例を見てきました:Jqueryコールバックとして使用すると、匿名関数と名前付き関数のメモリオーバーヘッド

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

ボタンが複数ある場合、それは効率的ではありませんか?匿名関数のプロトタイプの類似のコピーをメモリに単に格納するだけではないのですか? (は私の専門用語を修正)それがこれを行うために良いとは限りません。

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)); 
+0

あなたが書いた最初のバージョンが実際にハンドラを "クローン"したとは思わない...すべての要素が同じ参照を共有する必要があります! –

+0

JQueryはスマートなので、ハンドラは1つしか付けられません。 – Alex

+0

私はそれがjQueryの問題ではないと思いますが、単一の関数参照を渡すので、単一の参照が使用されます。 –

答えて

2

設計することにより、the observer patternは一つだけを保持します:ボタンへの参照が必要な場合は、

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

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

、あるいはこれをオブザーバのインスタンス。イベントハンドラは、このオブザーバをイベントオブジェクトの他のインスタンス(イベントパラメータを保持する要素、コンテキスト、コンテキストなど)とともに複数回呼び出します。

ハンドラは重複しないため、各サブジェクトの「リスナーストア」で参照されます。

注:
ケマルダグはまた、定義上、匿名関数は、関数の名前以下の性能を提供することを指摘し、それが本当であるならば、私は知りませんが、それであれば、差はごくわずかです。特に、JavaScriptのような言語では、関数anonを非常に広く使用しているため、パフォーマンスに与える影響はありません。

3

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

親機能にある変数にアクセスする必要がある場合にのみ、匿名機能を試してください。匿名関数は名前付き関数のほうがずっと高価です。しかし、グローバルクロージャで定義された名前付き関数は、グローバル名前空間を汚染し、自分で決める。

関連する問題