Многие статьи (например, msdn) сказали, что круговая ссылка не может быть очищена в некоторых браузерах, когда она включает DOM и объект JS.
(IE 6 вообще не может этого делать, и IE7 может делать это только между запросами страницы):
Javascript Native (утечки):
function leak(){
var elem = document.createElement("DIV");
document.body.appendChild(elem);
elem.onclick = function () {
elem.innerHTML = elem.innerHTML + ".";
// ...
};
}
Поскольку свойство onload элемента возвращается к себе через закрытие, оно создает круглую ссылку:
elem [DOM] -> elem.onclick [JS] -> elem [DOM]
Версия JQuery (Не теряет):
function leak(){
var elem = $('<div></div>');
$(document.body).append(elem);
elem.click(function () {
elem.html(elem.html() + ".");
// ...
};
}
В этом случае jQuery останавливает утечку во всех задействованных браузерах, несмотря на то, что все еще существует круговая ссылка:
elem [JS] -> element [DOM] -> elem.onclick [JS] -> elem [JS]
Мой вопрос: как jQuery останавливает утечку, если есть еще круговая ссылка?