我把別人的例子改了一下,覺得這樣寫更緊湊!套用別人的原話,當(dāng)一個(gè)DOM對(duì)象包含一個(gè)Js對(duì)象的引用(例如一個(gè)Event Handler), 而這個(gè)Js對(duì)象又持有對(duì)這個(gè)DOM對(duì)象的引用時(shí),一個(gè)環(huán)狀引用就行成了,于是在ie下就出現(xiàn)了內(nèi)存泄露。點(diǎn)擊“運(yùn)行代碼”并打開任務(wù)管理器看內(nèi)存變化。分別在ie8和ff下測試,差距不用多說。
運(yùn)行代碼
復(fù)制代碼 代碼如下:
<html>
<head>
<title>Memory leak</title>
<style>
body{
padding: 10px;
}
</style>
</head>
<body>
</body>
<script>
var q = [];
var n = 0;
setInterval(function(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
if(s){
s.parentNode.removeChild(s);
}
}
n++;
},10);
function makeSpan(){
var s = document.createElement("span");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=function(e){
s.style.backgroundColor="red";
alert(n);
};
return s;
};
</script>
</html>
在刪除節(jié)點(diǎn)的時(shí)候,手動(dòng)破除環(huán)狀引用,把里面setInterval那段代碼稍微改動(dòng)以下:
復(fù)制代碼 代碼如下:
setInterval(function(){
q.push(makeSpan());
if(q.length>=10){
var s = q.shift();
if(s){
s.onclick = null;//關(guān)鍵在這里
s.parentNode.removeChild(s);
}
}
n++;
},10);
新聞熱點(diǎn)
疑難解答
圖片精選