2009-07-27 19 views
5

IEのさまざまなバージョンでメモリリークがどのように作成されたかについて、かなり読んだことがあります。 いくつかの偉大な情報はここで見つけることができます:jQueryを使ってクロージャを使用jquery、クロージャ、およびメモリリークの可能性

http://msdn.microsoft.com/en-us/library/bb250448%28VS.85%29.aspx

http://laurens.vd.oever.nl/weblog/items2005/closures/

は非常に一般的です。 IEとメモリリークに関するJQueryのイベントモデル(クロージャが頻繁に使用されているところ)に話している記事は一切見つからない。上記の2番目の記事では、クロージャを使用するときのメモリリークを回避する方法を示しています。

JQueryは、クロージャを使用する際に潜在的なリークを浄化するのに役立つ記事に関して既に説明したような戦略を既に実装していますか?それとも、私が認識してコード化しなければならないことですか?例えば

はIE6/7のメモリリークを作成:

 
function foo(value) { 
    var bar = document.getElementById("selector"); 
    bar.attachEvent("onclick", 
     // closure 
     function() { 
      alert(value); // reference to 'value' from outer function scope 
     } 
    ); 
} 

上記の例の以下のjQueryのバージョンはIE6/7のメモリリークが発生しますか?

 
function foo(value) { 
    $('#selector').click(
     // closure 
     function() { 
      alert(value); // reference to 'value' from outer function scope 
     } 
    ); 
} 

答えて

4

はjQuery 1.3のソースから:

remove: function(selector) { 
    if (!selector || jQuery.filter(selector, [ this ]).length) { 
     // Prevent memory leaks 
     jQuery("*", this).add([this]).each(function(){ 
      jQuery.event.remove(this); 
      jQuery.removeData(this); 
     }); 
     if (this.parentNode) 
      this.parentNode.removeChild(this); 
    } 
}, 

あなたが見ることができるように、その要素を削除する前にすべてのイベントハンドラと関連データを削除し、それがサブ要素です。

+3

.remove()メソッドの呼び出しについては何の質問もありません。 –

+3

イベントハンドラを持つDOMオブジェクトを削除すると、このDOMオブジェクトへの参照を保持するクロージャーになることがあります。この問題を解決するには、すべてのイベントハンドラをDOMツリーから削除する前にDOMオブジェクトからすべてのイベントハンドラを削除します。 jQueryの.remove()メソッドはそれを正確に行います。 – Javier

関連する問題