匿名函数和闭包.第一篇

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

匿名函数

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

原文地址:https://www.cnblogs.com/linkhtml/p/5726826.html