JavaScript在IE中的内存泄露一共有四种情况:
首先要清楚JavaScript中的垃圾回收机制 当一个对象没有被变量所引用时就会自动回收。
1. 循环引用 当两个对象发生循环引用 并且其中一个是DOM对象是就会发生内存泄露。
实例代码:
一个构造函数需要传入一个DOM节点
function leak(dom){
this.domLink = dom;
dom.property = this;
}
这样每次创建一个对象是都会都会发生内存泄露。
解决方法:
显示获得DOM节点释放对JavaScript对象的引用。
2. 闭包的使用
function leak(){
var node = document.getElementById("test");
function inner(){
//在这里使用了node节点
}
node.onclick = inner;
}
解决方法:
这里如果要释放掉泄露的内存就必须注销绑定的函数,因为inner又是内部元素所以没有办法得到。要想 注销掉就必须得有一个引用。可以这样
node.property = inner;
这样我们就可以remove这个事件监听器了。
3. 交叉页面内存泄露
一般发生在动态创建页面元素并将其插入DOM树种发生。这种内存泄露主要是因为DOM元素插入的顺序不对引起 的。 并且即使页面导向其他页面或者关闭内存也不会被释放。引起这种泄露的原因是 在DOM节点之间会有一个节 点关系管理的对象 如果一次创建好插入进去就会有关系管理对象 而在插入DOM树种会继承DOM树中的这个对象 以前的就会被释放掉 就会造成内存泄露。 这是IE6一个很严重的BUG。
实例代码:
var parentNode = document.createElment("div");
var node = document.createElement("div");
//这样就会引起内存泄露
parentNode.appendChild(node);
document.documentElement.appendChild(parentNode);
document.documentElement.removeNode(parentNode);
parentNode.removeNode(node);
//这样就不会引起内存泄露
document.documentElement.appendChild(parentNode);
parentNode.appendChild(node);
4. 貌似泄露
这个是动态修改脚本文件里面的文本内容是会发生内存泄露,不过这种泄露会在页面清空或者转向时释放掉内 存。
可以参考下面链接: http://www.cnblogs.com/birdshome/archive/2006/05/28/ie_memoryleak.html