zoukankan      html  css  js  c++  java
  • 闭包

    闭包:js中老生常谈的一个话题了,具体什么是闭包呢?我理解的是:闭包就是一个能访问别的作用域(函数)中的变量的函数。正常情况下一个函数执行完毕其中的变量也就随之销毁,这也是js的垃圾回收机制的作用,但是倘若该函数中的变量被别的函数使用了,那就形成了闭包,导致垃圾回收机制迟迟不能回收该变量,这就是闭包带来性能问题的原因,它最大的作用就是能使变量长期驻扎在内存中不被清理,这样在一些框架中或大型函数中经常用到闭包,它带来的好处就是避免污染全局变量,在全局中声明最少的甚至不声明变量才是程序员的追求。尤其体现在模块化编程的时候,对于该模块范围内的“全局变量”就放在闭包中,等该模块整个执行完毕后再统一销毁,而全局中可能含有多个模块,每个模块范围内的“全局变量”都用(function(){.....})() 自执行的方式进行“封装”,这样就避免了在全局中声明变量,也就避免了污染全局变量的目的,不知道我叙述的清不清楚,正不正确,还是用代码来说话吧:

    	var a=1;
    	function aa(){
    		a++;
    		alert(a);
    	}
    	aa();//2
    	aa();//3 (累加)
    	alert(a);//3 
    上述中aa()多次调用会累加,因为函数内部可直接访问全局变量a。如果a定义在函数中就不会累加:

    	function aa(){
    		var a=1;
    		a++;
    		alert(a);
    	}
    	aa();//2
    	aa();//2(不会累加)
    	
    
    
    每次执行aa()都是2,不会出现累加。

    怎样使a定义到函数内部且还能实现累加呢?那就使用闭包:

    		function aa(){
    			var a=1;
    			return function(){
    				a++;
    				alert(a);
    			}
    		}
    		var c=aa();
    		c();//2
    		c();//3	(实现累加)
    		c();//4  (实现累加)
    		
    
    这样不仅实现了累加,又避免了变量在全局中声明,很环保。其思想就是这样,但代码依然不够完美,下面用(function(){......})()自执行函数的方式来改进:

    var c=(function aa(){
    			var a=1;
    			return function(){
    				a++;
    				alert(a);
    			}
    		})()
    		c();//2
    		c();//3	(实现累加)
    		c();//4 (实现累加)
    
    
    这样就很好了,自执行函数的方式真是让人省心,模块化编程常常使用它:

    var aa=(function(){
    
    		var a=1;
    	
    		function bb(){
    			a++;
    			alert(a);
    		}
    
    		function cc(){
    			a++;
    			alert(a);
    		}
    
    		return {         //返回以json的形式
    			b:bb,
    			c:cc
    		}
    	})();
    
    	aa.c();//2
    	aa.b();//3 
    	
    
    就这样使用闭包就干净利索的实现了a的累加。切记:闭包不可滥用。





  • 相关阅读:
    linq to sql 扩展方法
    跨线程的安全更新控件
    WinForm程序启动控制台窗口Console
    Winfrom巧用Using设置鼠标为WaitCursor
    在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
    基于Token的身份验证——JWT(转)
    jwt算法
    session问题总既然(深入理解)&Token问题理解&sso单点登陆理解实现
    1.spring boot要求最低jdk1.8,平安默认1.6问题,-》安装JDK1.8 2.maven 3.3.3要求最低jdk1.7->安装jdk 1.8
    批量插入删除
  • 原文地址:https://www.cnblogs.com/chayangge/p/4288676.html
Copyright © 2011-2022 走看看