zoukankan      html  css  js  c++  java
  • 匿名函数和闭包.第一篇

    匿名函数就是没有名字的函数,或者是它把名字隐藏起来,你看不到函数名。闭包是可访问一个函数作用域
    里的变量的函数,或者是就是一个函数里还有一个函数,那就是闭包。

    匿名函数

    //普通函数
    		function box(){
    			return 'link';
    		}
    		alert(box())
    
    //匿名函数
    		function (){     //单独的匿名函数,是无法运行的
    			return 'html'   //就算能运行,是无法调用,因为没有名称
    		}
    
    //把匿名函数赋值给变量
    		var box=function(){
    			return 'link'
    		};
    		alert(box)     //function(){return 'link'}
    		alert(box())   //link
    
    //通过自我执行来执行匿名函数
    		(function (){  //(匿名函数)();第一圆括号放匿名函数,第二个圆括号执行
    			alert('link');
    		})();
    
    //把匿名函数自我执行的返回值赋值给变量
    		var box=(function (){
    			return 'link';
    		})();
    		alert(box);   //link
    
    //自我执行后用alert()打印
    		alert((function(){
    			return 'link'
    		})());
    
    //自我执行匿名函数的传参
    		(function (age){
    			alert(age);
    		})(100);
    
    //函数里放一个匿名函数
    		function box(){
    			return function(){  //闭包 
    				return 'link';
    			}
    		}
    		alert(box)  //function box(){return function(){return 'link';}
    		
    		alert(box())  //function(){return 'link';}
    		
    		alert(box()()) //link
    
    //我们还有一种执行方法
    		function box(){
    			return function(){  //闭包 
    				return 'link';
    			}
    		}
    		var b=box();
    		alert(b)//function(){return 'link';}
    		
    		alert(b())//link
    

    闭包
      闭包是只有权访问另一个函数作用域中的变量的函数,创建闭包的常用的方式,就是在一个函数内部创建另一个函数,
      通常另一个函数访问这个函数的局部变量。

    //通过闭包访问局部变量
    		function box(){
    			var age=100;
    			return function(){
    				return age;
    			}
    		}
    		alert(box()())
    

     使用闭包有一个优点,也是它的缺点:就是可以把局部变量驻留在内存中,可以避免使用全局变量。
      (全局变量污染导致应用程序不可预测性,每个模块都可调用必将引用灾难,所以推荐使用私有的,封装的局部变量)。

     //使用全局变量进行累加
    		 var age=100;
    		 function box(){
    		 	age++;
    		 }
    		 alert(age)
    		 box()
    		 alert(age)
    
    //使用匿名函数实现局部变量驻留内存中从而累加
            function box(){
    		  var age=100;
    		  return function(){
    		  age++;
    		  return age;
    		  };
    		}
    		var b=box();
    		alert(b());
    		alert(b());
    		alert(b());
    		alert(b());
    
    		b=null;  //解除引用,等待垃圾回收
    		alert(b());
    

     ps:由于闭包里作用域返回的局部变量资源不会被立即销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。

  • 相关阅读:
    B树和B+树的插入、删除图文详解
    使用limit分页查询时,做delete操作,会导致丢失数据
    【转载】研发应该懂的binlog知识(下)
    【转载】研发应该懂的binlog知识(上)
    OOM排除与JVM调优
    Intellij IDEA集成JProfiler性能分析神器
    Java程序内存分析:使用mat工具分析内存占用
    mysql 查询结果为空时值时执行后面的sql语句
    mysql 无数据插入,有数据更新
    C# 超大数据量导入 SqlBulkCopy
  • 原文地址:https://www.cnblogs.com/linkhtml/p/5726826.html
Copyright © 2011-2022 走看看