简介
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。在C++中,因为是手动管理内存,内存泄露是经常出现的事情。而现在流行的 C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露。浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器 垃圾回收方法有bug,会产生内存泄露,以下情况都是基于IE浏览器。
1.给 DOM 对象添加的属性是一个对象的引用
var MyObject = {}; document.getElementById('myDiv').myProp = MyObject;
2.DOM 对象与 JS 对象相互引用
function Encapsulator(element) { this.elementReference = element; element.myProp = this; } new Encapsulator(document.getElementById('myDiv'));
3 .给 DOM 对象用 attachEvent 绑定事件
function doClick() {} element.attachEvent("onclick", doClick);
解决方法:element.detachEvent('onclick', doClick);
4 .从外到内执行 appendChild 。这时即使调用 removeChild 也无法释放
var parentDiv = document.createElement("div"); var childDiv = document.createElement("div"); document.body.appendChild(parentDiv); parentDiv.appendChild(childDiv);
解决方法:从内到外执行appendChild
5 .反复重写同一个属性会造成内存大量占用 ( 但关闭 IE 后内存会被释放 )
for(i = 0; i < 5000; i++) { hostElement.text = "asdfasdfasdf"; }
//这种方式相当于定义了5000个属性!
解决方法:就是编程的时候尽量避免出现这种情况