2011-02-03 16 views
1

jQueryの最新リリースでかなり単純なリークが検出された可能性があります。jQuery 1.5 IE8でメモリリークが発生する

var listen = function(){}; 
var testLeak = function(){ 
    for(var i = 0; i<100; i++){ 
     var item = {}; 
     item.elem = $(document.createElement('div')); 
     item.addListener = function(name,listener){ 
      var self = this; 
      var wrappedListener = function(){ 
       return listener.apply(self,arguments); 
      } 
      this.elem.bind(name, wrappedListener); 
      wrappedListener = null; 
     } 
     item.addListener('eventName',listen); 
     item.elem.unbind(); 
     item.elem.remove(); //with this un-commented, the loop leaks 
     // item.elem = null; //with this also un-commented, the leak dissapears 
    } 
}; 

$(document).ready(function(){ 
    setInterval(testLeak, 100); 
} 

私はこの実証jsfiddleでプロジェクトを作成しました:

http://jsfiddle.net/rJ8x5/8/

私が)(ではないコール.removeを行う場合、これは漏れないことに注意することが重要であり、 .remove()を呼び出しても.elem参照をnullに設定しても、それは漏れません。 jQueryが.remove()を呼び出すときにjQueryがitemへの参照を保持していて、.elemへの参照を保持しているかのようです。 考えていますか? ご覧のとおり、私は、意図しないクロージャを防ぐためにwrappedListenerをnullに設定しましたが、これは役に立ちません。

EDIT:実際にノードをDOMに追加するようにjsfiddleスクリプトを更新しました。これはではなくの動作に影響します

EDIT2:問題の解決策が見つかりましたが、remove()の呼び出しをインクルードするときにこのスクリプトがなぜリークするのかはまだ分かりません。それでも答えが欲しい...

+3

バグレポートを提出してください。 –

+0

私はこれがここにあると推測しています。http://bugs.jquery.com/ticket/8171?cversion=1&cnum_hist=6 –

+0

ええ、そうです。 – jordancpaul

答えて

0

私の例では "var item = {};"のように)クロージャベースのメモリリークが発生した場合、detacheventはjavascript/DOM循環参照が壊れています。要素への参照を手動でnullにする必要があります。なぜremove()の呼び出しが物事をこの状態にするように見えるのか決して決して決まらなかったのです。

+2

はい...私自身の質問に答えました – jordancpaul

関連する問題