關(guān)于js內(nèi)存泄露的一個好例子
更新時間:2013年12月09日 09:53:09 作者:
這篇文章主要介紹了關(guān)于js內(nèi)存泄露的一個好例子。需要的朋友可以過來參考下,希望對大家有所幫助
我把別人的例子改了一下,覺得這樣寫更緊湊!套用別人的原話,當(dāng)一個DOM對象包含一個Js對象的引用(例如一個Event Handler), 而這個Js對象又持有對這個DOM對象的引用時,一個環(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>
那么在ie下該怎么解決呢?
在刪除節(jié)點(diǎn)的時候,手動破除環(huán)狀引用,把里面setInterval那段代碼稍微改動以下:
復(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);
您可能感興趣的文章:
- 解決JS內(nèi)存泄露之js對象和dom對象互相引用問題
- JS閉包、作用域鏈、垃圾回收、內(nèi)存泄露相關(guān)知識小結(jié)
- 解決js函數(shù)閉包內(nèi)存泄露問題的辦法
- 淺談js 閉包引起的內(nèi)存泄露問題
- JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧
- 容易造成JavaScript內(nèi)存泄露幾個方面
- js內(nèi)存泄露的幾種情況詳細(xì)探討
- Javascript 閉包引起的IE內(nèi)存泄露分析
- 權(quán)威JavaScript 中的內(nèi)存泄露模式
- 總結(jié)JavaScript在IE9之前版本中內(nèi)存泄露問題
相關(guān)文章
layer彈出子iframe層父子頁面?zhèn)髦档膶?shí)現(xiàn)方法
這篇文章主要介紹了layer彈出子iframe層父子頁面?zhèn)髦档膶?shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
axios攔截器機(jī)制的實(shí)現(xiàn)原理詳解
axios 不僅提供了一套跨平臺請求,另外還提供了“攔截器”這一中間件機(jī)制,方便你在請求之前、響應(yīng)之后做些操作處理,本文給大家詳細(xì)介紹了axios 攔截器機(jī)制是如何實(shí)現(xiàn)的,需要的朋友可以參考下2024-05-05

