IE中的記憶體洩露

wangchengnokia發表於2010-12-10

JavaScript在IE中的記憶體洩露一共有四種情況:

首先要清楚JavaScript中的垃圾回收機制  當一個物件沒有被變數所引用時就會自動回收。

1.  迴圈引用  當兩個物件發生迴圈引用 並且其中一個是DOM物件是就會發生記憶體洩露。

例項程式碼:

一個建構函式需要傳入一個DOM節點

function leak(dom){

this.domLink = dom;

dom.property = this;

}

這樣每次建立一個物件是都會都會發生記憶體洩露。

                 解決方法:

顯示獲得DOM節點釋放對JavaScript物件的引用。

 

2.  閉包的使用 

function leak(){

var node = document.getElementById("test");

function inner(){

//在這裡使用了node節點 

}

node.onclick = inner;

}

 

解決方法:

這裡如果要釋放掉洩露的記憶體就必須登出繫結的函式,因為inner又是內部元素所以沒有辦法得到。要想 登出掉就必須得有一個引用。可以這樣

node.property = inner;

這樣我們就可以remove這個事件監聽器了。

 

3.  交叉頁面記憶體洩露  

     一般發生在動態建立頁面元素並將其插入DOM樹種發生。這種記憶體洩露主要是因為DOM元素插入的順序不對引起     的。 並且即使頁面導向其他頁面或者關閉記憶體也不會被釋放。引起這種洩露的原因是 在DOM節點之間會有一個節    點關係管理的物件 如果一次建立好插入進去就會有關係管理物件 而在插入DOM樹種會繼承DOM樹中的這個物件              以前的就會被釋放掉 就會造成記憶體洩露。  這是IE6一個很嚴重的BUG。

例項程式碼:

var parentNode = document.createElment("div");

var node = document.createElement("div");

 

//這樣就會引起記憶體洩露  

parentNode.appendChild(node);

document.documentElement.appendChild(parentNode);

document.documentElement.removeNode(parentNode);

parentNode.removeNode(node);

 

//這樣就不會引起記憶體洩露

document.documentElement.appendChild(parentNode);

parentNode.appendChild(node);

4.  貌似洩露

這個是動態修改指令碼檔案裡面的文字內容是會發生記憶體洩露,不過這種洩露會在頁面清空或者轉向時釋放掉內                   存。

 

         可以參考下面連結:  http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html

相關文章