2012-04-25 4 views
7

私の質問は、あなたが「長い間」表示されるウェブページを作成していることを前提としています。私はこのようなシナリオでJQuery/JavaScriptを使用する際にメモリリークを引き起こす一般的な問題点について何か不思議です。たとえば、要素のコレクションで$.remove()に電話すると、メモリの点でどうなるでしょうか?ありがとう!JQuery/JavaScriptを使用してメモリリークを引き起こす一般的な方法は何ですか?

答えて

1

JavaScriptはガベージコレクションを使用して、使用していない文字列、オブジェクト、配列、および関数が占有するメモリを再利用します。 これによりプログラマは、自分自身でメモリを明示的に割り当て解除する必要がなくなり、JavaScriptプログラミングよりも簡単にプログラミングできるようになりました。

参考文献:Check this for morean answer on SO。最初のケースではメカニズムMDN

var i; 
var els = document.getElementsByTagName('*'); 

// Case 1 
for(i=0 ; i<els.length ; i++){ 
    els[i].addEventListener("click", function(e){/*do something*/}, false}); 
} 

// Case 2 
function processEvent(e){ 
    /*do something*/ 
} 

for(i=0 ; i<els.length ; i++){ 
    els[i].addEventListener("click", processEvent, false}); 
} 

を登録する場合に

メモリの問題は、新しい(匿名)関数は、各ループの変わり目に作成されます。後者の場合、以前に宣言された同じ関数がイベントハンドラとして使用されます。これにより、メモリ消費量が少なくなります。さらに、最初のケースでは、匿名関数への参照が保持されないため、ハンドラへの参照がないためelement.removeEventListenerを呼び出すことはできません。

myElement.removeEventListener("click", processEvent, false) 
+1

どちらの場合も、btwを吸うと、イベントバブリングを使用できるときにすべての要素にイベントを登録しています。 –

関連する問題