【发布时间】:2023-03-19 12:47:01
【问题描述】:
许多文章(例如msdn)表示,当循环引用涉及DOM 对象和JS 对象时,在某些浏览器中无法清理循环引用。
(IE 6根本做不到,IE7只能在页面请求之间做):
Javascript 原生(泄漏):
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 如何阻止泄漏?
【问题讨论】:
标签: javascript jquery memory-leaks