關(guān)于js內(nèi)存泄露的一個好例子
更新時間:2013年12月09日 09:53:09 作者:
這篇文章主要介紹了關(guān)于js內(nèi)存泄露的一個好例子。需要的朋友可以過來參考下,希望對大家有所幫助
我把別人的例子改了一下,覺得這樣寫更緊湊!套用別人的原話,當一個DOM對象包含一個Js對象的引用(例如一個Event Handler), 而這個Js對象又持有對這個DOM對象的引用時,一個環(huán)狀引用就行成了,于是在ie下就出現(xiàn)了內(nèi)存泄露。點擊“運行代碼”并打開任務(wù)管理器看內(nèi)存變化。分別在ie8和ff下測試,差距不用多說。
運行代碼
復制代碼 代碼如下:
<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>
那么在ie下該怎么解決呢?
在刪除節(jié)點的時候,手動破除環(huán)狀引用,把里面setInterval那段代碼稍微改動以下:
復制代碼 代碼如下:
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);
您可能感興趣的文章:
相關(guān)文章
layer彈出子iframe層父子頁面?zhèn)髦档膶崿F(xiàn)方法
這篇文章主要介紹了layer彈出子iframe層父子頁面?zhèn)髦档膶崿F(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11

