переписано для дальнейшего уточнения
На самом деле в предлагаемом примере есть 2 причины утечки памяти.Первая утечка памяти возникает из-за создания прямой ссылки на действующий узел DOM внутри замыкания.Сборщики мусора (JS & DOM) устаревших браузеров, таких как IE6, не могут аннулировать такие ссылки.Следовательно, необходимо обнулить ссылки на узлы в конце вашей функции.
jQuery обходит это по умолчанию, поскольку живые элементы DOM присоединяются к объекту jQuery в качестве атрибутов / свойств, с которыми вышеупомянутые сборщики мусора имеютНет проблем в определении нулевых ссылок.Если объект jQuery имеет нулевые ссылки, он просто очищается и его атрибуты / свойства (в данном случае ссылки на живые элементы DOM) вместе с ним.
Поэтому, чтобы избежать этой утечки памяти, нужно иметь объектсохранить ссылку на действующий узел DOM, а затем ссылку на объект в ваших замыканиях.Замыкания будут поддерживать только ссылки на объект, а не на действующий элемент DOM, поскольку эта ссылка принадлежит объекту.
// will still leak, but not due to closure references, thats solved.
function noLeak(){
var obj= {
elem: document.createElement('div')
}
obj.elem.onclick = function(){
obj.elem.innerHTML = obj.elem.innerHTML + ".";
}
}
Это очистило наиболее очевидную циклическую ссылку, но все еще есть утечка (onclick).Узел имеет ссылку на функцию, которая имеет ссылку на объект, который, в свою очередь, имеет ссылку на узел.Единственный способ обойти эту утечку - это поучаствовать в конкурсе addEvent (множество людей работали над этой утечкой;)).По совпадению, в нем можно найти необходимый код, поэтому мои извинения за то, что я не предоставил код для этого;)
Создание оболочки для системы событий добавляет еще немного кода, но это необходимо.Основная идея состоит в том, чтобы добавить общий eventHandler, который делегирует событие в кэш / систему событий, в которой хранятся необходимые ссылки.При событии unload кэш очищается, разбивая циклические ссылки, позволяя сборщикам мусора (JS и DOM) убирать свои собственные углы.