Many articles (e.g. msdn) have told be that a circular reference can not be cleaned up in some browsers when it involves a DOM object and a JS object.
(IE 6 can't do it at all and IE7 can only do it between page requests):
Javascript Native (Leaks):
function leak(){
var elem = document.createElement("DIV");
document.body.appendChild(elem);
elem.onclick = function () {
elem.innerHTML = elem.innerHTML + ".";
// ...
};
}
Because the element's onload property refers back to itself through a closure, it creates a circular reference:
elem [DOM] -> elem.onclick [JS] -> elem [DOM]
JQuery Version (Does NOT Leak):
function leak(){
var elem = $('<div></div>');
$(document.body).append(elem);
elem.click(function () {
elem.html(elem.html() + ".");
// ...
};
}
In this case, jQuery stops the leak from happening in ALL browsers concerned even though there is still a circular reference:
elem [JS] -> element [DOM] -> elem.onclick [JS] -> elem [JS]
My Question: How does jQuery stop the leak if there is still a circular reference?