2011年5月25日星期三

闭包,内存泄露,内存回收CollectGarbage

闭包会导致内存泄露,这让很多同学不敢使用闭包,做一个测试下面是在函数内部的闭包和闭包调用,出现了内存泄露的情况,但是在不同浏览器表现个不一样

FF:内存在执行完后回收

IE:部分版本会回收,IE9会有明显泄露,但是调用了CollectGarbage后有明显的回收效果

 <div onclick="fLeak();">start</div>
  <script type="text/javascript">
  <!--
	function fTest(){
		var aList = [];
		var nLength = 100000;
		for(var i=0;i<nLength;i++){
			var oDiv = document.createElement("DIV");
			aList.push(oDiv);
			document.body.appendChild(oDiv);
		}
		for(var i=0;i<nLength;i++){
			aList[i].parentNode.removeChild(aList[i],true);
		}
		//闭包,泄露?!
		return function(){
			alert(aList.length);
		}
	}
	function fLeak(){
		(fTest())();
		//IE下不加这句各个版本表现不一
		//IE8会自行回收,但是有部分泄露
		//IE9不会自行回收,连续运行会导致明显内存泄露
		try{
			setTimeout(function(){CollectGarbage()},1000);
		}catch(exp){}
	}
  //-->
  </script>

总结如下:


1:闭包并不是洪水猛兽,只要在局部使用,注意调用后及时销毁,就不会出现内存泄露。


2:注意回收,没准CollectGarbage会有意想不到的收获。

没有评论:

发表评论