ie下js內存釋放問題(轉載)

在ie下的js編程中,如下的編程方式都會形成即便關閉ie也沒法釋放內存的問題,下面分類給出:

一、給dom對象添加的屬性是一個對象的引用。範例:
var myobject = {};
document.getelementbyid('mydiv').myprop = myobject;
解決方法
在window.onunload事件中寫上: document.getelementbyid('mydiv').myprop = null;


二、dom對象與js對象相互引用。範例:
function encapsulator(element) {
  this.elementreference = element;
  element.myprop = this;
}
new  encapsulator(document.getelementbyid('mydiv'));
解決方法
在onunload事件中寫上: document.getelementbyid('mydiv').myprop = null;


三、給dom對象用attachevent綁定事件。範例:
function doclick() {}
element.attachevent("onclick", doclick);
解決方法
在onunload事件中寫上: element.detachevent('onclick', doclick);


四、從外到內執行appendchild。這時即便調用removechild也沒法釋放。範例:
var parentdiv =  document.createelement("div");
var childdiv = document.createelement("div");
document.body.appendchild(parentdiv);
parentdiv.appendchild(childdiv);
解決方法
從內到外執行appendchild:
var parentdiv =  document.createelement("div");
var childdiv = document.createelement("div");
parentdiv.appendchild(childdiv);
document.body.appendchild(parentdiv);


五、反覆重寫同一個屬性會形成內存大量佔用(但關閉ie後內存會被釋放)。範例:
for(i = 0; i < 5000; i++) {
  hostelement.text = "asdfasdfasdf";
}
這種方式至關於定義了5000個屬性!
解決方法:
其實沒什麼解決方法:p~~~就是編程的時候儘可能避免出現這種狀況咯~~


說明: 一、以上資料均來源於微軟官方的msdn站點,連接地址: http://msdn.microsoft.com/librar ... e_leak_patterns.asp 你們能夠到上面這個地址中看到詳細的說明,包括範例和圖例都有。只是我英文不太好,看不太懂,若是我上述有失誤或有須要補充的地方請你們指出。 二、對於第一條,事實上包括 element.onclick = funcref 這種寫法也算在其中,由於這也是一個對對象的引用。在頁面onunload時應該釋放掉。 三、對於第三條,在msdn的英文說明中好像是說即便調用detachevent也沒法釋放內存,由於在attachevent的時候就已經形成內存「leak」了,不過detachevent後狀況仍是會好一點。不知道是否是這樣,請英文好的親可以指出。 四、在實際編程中,這些內存問題的實際影響並不大,尤爲是給客戶使用時,客戶對此毫不會有察覺,然而這些問題對於程序員來講卻始終是個心病 --- 有這樣的bug內心總會以爲不舒服吧?能解決則給與解決,這樣是最好的。事實上我在webfx.eae.net這樣頂級的js源碼站點中,在它們的源碼裏都會看到採用上述解決方式進行內存的釋放管理。
相關文章
相關標籤/搜索