a3mao 发表于 2013-2-7 18:51:21

JS内存泄漏

最近用JS写了一个控件----div模拟弹出窗口.之前发布过一个版本,网友说有很严重的内存泄漏问题,经过此次修改,已经解决了此问题.对于JS的内存泄漏很很奇怪,一直都没有想过有此问题,也许是只会做java吧,很少考虑内存释放的问题.针对此问题,特意在网上找了一些资料.摘录如下.
1.内存泄漏检测工具.http://outofhanwell.com/ieleak/index.php?title=Main_Page
说明文档:https://ieleak.svn.sourceforge.net/svnroot/ieleak/trunk/drip/docs/index.html
2.如何修正JS的内存泄漏,一些教程:http://outofhanwell.com/ieleak/index.php?title=Fixing_Leaks

1)function loadMyPage() {
   var elem = document.getElementById('myelement');
   elem.onclick = function () {
      window.alert('hi!');
   };
}
这段代码就能引起JS的内存泄漏,如果修正:elem = null;
或者
function onMyElemClick() {
   window.alert('hi!');
}
function loadMyPage() {
   var elem = document.getElementById('myelement');
   elem.onclick = onMyElemClick;
}

2). function Helper(elem)
{
    this.elem = elem;
}
var elem = document.getElementById('elem');
elem.helper = new Helper(elem);


var parent = document.getElementById('parent');
var child = document.getElementById('child');

// make it easy to find one from the other
parent.other = child;
child.other = parent;

以上两段代码都会引起内存泄漏.
3)如果将一个element从一个elemeng删除最好用 innerHTML="". 如下:
function discardElement(element) {
    var garbageBin = document.getElementById('IELeakGarbageBin');
    if (!garbageBin) {
      garbageBin = document.createElement('DIV');
      garbageBin.id = 'IELeakGarbageBin';
      garbageBin.style.display = 'none';
      document.body.appendChild(garbageBin);
    }

    // move the element to the garbage bin
    garbageBin.appendChild(element);
    garbageBin.innerHTML = '';
}
页: [1]
查看完整版本: JS内存泄漏