Полагаю, я обнаружил довольно простую утечку в последней версии jQuery.
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 на ноль,это также не протекает.Как будто jQuery держит ссылку на элемент, когда я вызываю .remove (), которая, в свою очередь, содержит ссылку на .elem.Какие-нибудь мысли?Как вы можете видеть, я установил значение обернутого прослушивателя в null, чтобы предотвратить случайное закрытие, но это не помогает.
РЕДАКТИРОВАТЬ: я обновил скрипт jsfiddle, чтобы фактически добавить узел в DOM.Это не влияет на поведение
РЕДАКТИРОВАТЬ 2: Таким образом, решение проблемы было найдено, но мне все еще не ясно, почему этот сценарий будет течь, только когда вы включаете вызов, чтобы удалить().Все еще надеемся на ответ ...