一.直接循环内存引用
1.自身进行引用的 DOM 对象和不在树中的对象间的循环引用
function leaktest1() { var elem1 = document.createElement("DIV"); elem1.thing = elem1; }
2.不在树中的 DOM 对象间的循环引用
function leaktest2() { var elem1 = document.createElement("DIV"); var elem2 = document.createElement("DIV"); elem1.thing = elem2; elem2.item = elem1; }
3.DOM 对象和 JScript 对象间的循环引用
function leaktest3() { var x = new Object(); x.obj = document.createElement("DIV"); x.obj.jsobj = x; }
4.在临时标记中时 DOM 对象间的循环引用
function leaktest4() { var elem1 = document.createElement("DIV"); var elem2 = document.createElement("DIV"); elem1.appendChild(elem2); elem1.thing = elem2; elem2.item = elem1; }
5.使用 removeNode 将 DOM 对象从树中删除时,DOM 对象间的循环引用
function leaktest5() { var elem1 = document.createElement("DIV"); document.body.appendChild(elem1); elem1.thing = elem1; elem1.removeNode(true); }
6.使用 innerHTML 将 DOM 对象从树中删除时,DOM 对象间的循环引用
function leaktest6() { var elem1 = document.createElement("DIV"); document.body.appendChild(elem1); elem1.thing = elem1; elem1.parentElement.innerHTML = ""; }
二.闭包引起的循环内存引用
1.带有动态创建的元素的闭包
function leaktest7() { var elem = document.createElement("DIV"); elem.onload = function (){ var y = elem; } }
2.带有添加到树中并使用 removeNode 删除的元素的闭包
function leaktest8(){ var elem = document.createElement("DIV"); document.body.appendChild(elem); elem.onload = function () { var y = elem; } elem.removeNode(); }
3.带有添加到树中并使用 innerHTML 删除的元素的闭包
function leaktest9() { var elem = document.createElement("DIV"); document.body.appendChild(elem); elem.onload = function () { var y = elem; } elem.parentElement.innerHTML = ""; }