IE中的内存泄露
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