Hedger Wang 在國(guó)內(nèi) blog 上得到的方法:使用 try … finally 結(jié)構(gòu)來(lái)使對(duì)象最終為 null ,以阻止內(nèi)存泄露。
其中舉了個(gè)例子:
function createButton() { var obj = document.createElement("button"); obj.innerHTML = "click me"; obj.onclick = function() { //handle onclick }
obj.onmouseover = function() { //handle onmouseover } return obj;//return a object which has memory leak problem in IE6 }
var dButton = document.getElementById("d1").appendChild(createButton()); //skipped....
對(duì)于 IE6 中,引起內(nèi)存泄露的原因,可看《Understanding and Solving Internet Explorer Leak Patterns》一文。
上面的例子,應(yīng)該屬于上文中的 “Closures”原因。
再看下用 try … finally 的解決方法:
/** * Use the try ... finally statement to resolve the memory leak issue */ function createButton() { var obj = document.createElement("button"); obj.innerHTML = "click me"; obj.onclick = function() { //handle onclick } obj.onmouseover = function() { //handle onmouseover }
//this helps to fix the memory leak issue try { return obj; } finally { obj = null; } }
var dButton = document.getElementById("d1").appendChild(createButton()); //skipped....
可能大家有疑問(wèn): finally 是如何解析的呢?
答案是:先執(zhí)行 try 語(yǔ)句再執(zhí)行 finally 語(yǔ)句。
例如:
function foo() { var x = 0; try { return print("call return " + (++x)); } finally { print("call finally " + (++x)); } }
print('before'); print(foo()); print('after');
返回的結(jié)果為: print » before print » call return 1 print » call finally 2 print » true print » after
更多詳細(xì)的演示: 《Finally, the alternative fix for IE6’s memory leak is available》
相關(guān)的一些討論: 《Is “finally” the answer to all IE6 memory leak issues?》
本文鏈接:http://m.95time.cn/tech/web/2008/5930.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|