jQuery 1.5 Утечка памяти в IE8 - PullRequest
1 голос
/ 03 февраля 2011

Полагаю, я обнаружил довольно простую утечку в последней версии 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: Таким образом, решение проблемы было найдено, но мне все еще не ясно, почему этот сценарий будет течь, только когда вы включаете вызов, чтобы удалить().Все еще надеемся на ответ ...

1 Ответ

0 голосов
/ 23 января 2013

Оказывается, если произошла утечка памяти на основе замыкания (как в моем примере с "var item = {};"), detachevent не будет сигнализировать, что циклическая ссылка javascript / DOM была нарушена. Вы ДОЛЖНЫ обнулить ссылку на элемент вручную. Почему вызов remove (), похоже, переводит вещи в это состояние, так и не было определено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...