Hedger Wang 在国内 blog 上得到的方法:使用 try … finally 结构来使对象最终为 null ,以阻止内存泄露。
其中举了个例子:
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....
对于 IE6 中,引起内存泄露的原因,可看《Understanding and Solving Internet Explorer Leak Patterns》一文。
上面的例子,应该属于上文中的 “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....
可能大家有疑问: finally 是如何解析的呢?
答案是:先执行 try 语句再执行 finally 语句。
例如:
function foo() { var x = 0; try { return print("call return " + (++x)); } finally { print("call finally " + (++x)); } }
print('before'); print(foo()); print('after');
返回的结果为: print » before print » call return 1 print » call finally 2 print » true print » after
更多详细的演示: 《Finally, the alternative fix for IE6’s memory leak is available》
相关的一些讨论: 《Is “finally” the answer to all IE6 memory leak issues?》
本文链接:http://www.blueidea.com/tech/web/2008/5930.asp
出处:蓝色理想
责任编辑:bluehearts
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|