首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

IE中的内存储器泄露

2012-11-22 
IE中的内存泄露JavaScript在IE中的内存泄露一共有四种情况:首先要清楚JavaScript中的垃圾回收机制 ?当一个

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

热点排行