合理使用闭包

引:     

 

   初学函数式的脚本语言如javascript时,觉得程序写起来很顺手,特别是随时可用的闭包,作用域链的应用到处可见,以前用静态的c++,java ,突然觉得随时可以写函数,函数可以方便引用定义处的变量是多么自由和随意。



错误模式:

 

     但是这种编程模式并不是只有好处,代价就是急剧增长的内存占用以及稍不注意ie下细微的内存泄漏,举个极端的编程模式下内存的不正常占用:

 

<script>
	window.οnlοad=function(){
		
		var memory="";
		var i=0;
		for(i=0;i<10000;i++)
		    memory+="eat memory";
		
		setTimeout (function() {
		    alert("时间到了,我要做点事情。"+i);
		    
		},50000);
		
		
	
	}
</script>

 

alert前稳定后的内存占用:

 

 


alert后稳定后的内存占用:

 

 

 

可见前后有400多k的差距,示例程序用了定时处理函数,但是那个函数并没有引用memory这个大变量,而仅仅引用了外部的一个数字变量,可以由于memory大变量存在于定时函数的作用域链中,而使得在定时函数执行前,大变量也释放不了(长时间系统大量内存不必要占用),使用闭包得不偿失。


对于这种场景,适合的做法是将自已要的变量传过去即可,避免闭包引起的大规模变量引用,当然传变量的技巧还是闭包,但是这样可以自己控制,大大减少闭包引用的变量大小。

 

改进模式:

 

<script>
    
    var test={};
    test.doo=function(i){
       alert("时间到了,我要做点事情。"+i);
    };
    Function.prototype.createCallback=function(){
        var that=this;    
        var args=[].slice.apply(arguments);    
        return function(){
            that.apply(null,args);
        };        
    };
	window.οnlοad=function(){
		
		var memory="";
		var i=1;
		for(i=0;i<10000;i++)
		    memory+="eat memory";
		
		setTimeout (test.doo.createCallback(i),50000);
		
		
	
	}
</script>
 

稳定后内存占用:

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值