看了一篇帖子,http://www.iteye.com/topic/180611,了解了IE的内存泄露问题。
借用一下代码,写个自己的理解,放在这备忘。
IE为什么会出现内存泄露呢?
我的理解是首先leakTest function 中有了对aa元素的引用,
然后aa元素的kk属性有了一个对匿名function的引用,而这个
匿名function是在leakTest function中定义的,这样就形成
了闭包,也就是说这个匿名function不能离开leakTest function
而存在,这样就出现了一个引用循环。
即leakTest-->aa-->匿名function(而这个匿名function把leakTest function拉下水了,相当于引用了leakTest function),这下完蛋了,IE不知道怎么解决这个问题了,那就泄露吧。
解决的方式很简单:打断这个引用链!
在remove divA后,设置divA = null。
或者不要在leakTest()中保存对aa的引用,用document.getElementById('aa')进行操作
借用一下代码,写个自己的理解,放在这备忘。
<div id="bb"><div id="aa">cc</div></div>
<script type="text/javascript">
function leakTest(){
var a=[];
for(var i=0;i<100000;i++){
a.push('a');
}
var divA=document.getElementById('aa');
divA.kk=function(){};
divA.parentNode.removeChild(divA);
}
leakTest();
</script>
IE为什么会出现内存泄露呢?
我的理解是首先leakTest function 中有了对aa元素的引用,
然后aa元素的kk属性有了一个对匿名function的引用,而这个
匿名function是在leakTest function中定义的,这样就形成
了闭包,也就是说这个匿名function不能离开leakTest function
而存在,这样就出现了一个引用循环。
即leakTest-->aa-->匿名function(而这个匿名function把leakTest function拉下水了,相当于引用了leakTest function),这下完蛋了,IE不知道怎么解决这个问题了,那就泄露吧。
解决的方式很简单:打断这个引用链!
在remove divA后,设置divA = null。
或者不要在leakTest()中保存对aa的引用,用document.getElementById('aa')进行操作