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でプロジェクトを作成しました:
私が)(ではないコール.removeを行う場合、これは漏れないことに注意することが重要であり、 .remove()を呼び出しても.elem参照をnullに設定しても、それは漏れません。 jQueryが.remove()を呼び出すときにjQueryがitemへの参照を保持していて、.elemへの参照を保持しているかのようです。 考えていますか? ご覧のとおり、私は、意図しないクロージャを防ぐためにwrappedListenerをnullに設定しましたが、これは役に立ちません。
EDIT:実際にノードをDOMに追加するようにjsfiddleスクリプトを更新しました。これはではなくの動作に影響します
EDIT2:問題の解決策が見つかりましたが、remove()の呼び出しをインクルードするときにこのスクリプトがなぜリークするのかはまだ分かりません。それでも答えが欲しい...
バグレポートを提出してください。 –
私はこれがここにあると推測しています。http://bugs.jquery.com/ticket/8171?cversion=1&cnum_hist=6 –
ええ、そうです。 – jordancpaul