JavaScript闭包函数的写法

<script type="text/javascript">
	    //通过js内置的函数构造器创建函数
	     var func=new Function('a','b','return a+b');
	     alert(typeof func);
	    alert(func(3,5));
	    
	    //和下面的效果一样
	    var func1=function(a,b){return a+b};
	    alert(func1(6,7));
         //作用域链
	    var a=1;
	    function test(){
	    	var b=2;
	    	return a;
	    }
	     test();
	     alter(b);
//scope  chain  作用域链的效果
	    var a=1;
	     function test(){
	     	var b=2;
	     	function test1(){
	     		var c=3;
	     		alert(a);  //1
	     		alert(b);  //2
	     		alert(c);   //3
	     		 return c;
	     	}
	     	test1();  
	     }
	    test();
           //词法作用域
	   function	f1(){
	   	var a=1;   //局部变量    不存在共享的词法作用域
	   	return f2();
	   }
	    function f2(){
	    	return a;
	    }
	    alter(f1());//undefined
             function f1(){
	    	var a=1;
	    	return f2();
	    }
	    function f2(){
	    	var b=3;
	     //alert(b);
	      return a;
	    }
	   // alter(f1());//undefined
	    var a=55;
	    alert(f1());   //55
	    //对变量进行重复添加
	    a=656;
	   alert(f1());

 第一种形式的闭包:

 	function f(){
	   		var a='sunliyuan';
	   		//返回闭包
	   		return function(){
	   			//返回父节a
	   			return a;
	   		}
	   	}
	   //	alert(a);//undefined
	   var test=f();
	   alert(test());   //sunliyuan

 第二种形式的闭包:

         var n;
	  function f(){
	  var a='sunliyuan';
	  n=function(){
	  	return a;
	    };
	  }
	   	f();
	   	alert(n());

 第三种形式的闭包:(能够读取其他函数内部变量的一个函数,将函数内部和外部链接起来的一个桥梁)

 	function f(param){
	   		var n=function(){
	   			return param;
	   		}
	   		param++;
	   		return n;
	   	}
	   	var test=(456);
	   	alert(test());   //457

 暴露在外部:

 function f1(){
	   	//变量的值始终保持在内存中
	   	var n=1;
	   	//定义全局的变量
	   	test=function(){
	   		n+=1;
	   	};
	   	function f2(){
	   		alert(n); //1
	   	}
	   	return f2;
	   }
	   var res=f1();
	   alert(res());  //undefined
	   test();
	   alert(res());

 设置和读取:

 var setValue,getValue;
	  (function(){
	  	var n=0;
	  	//设置和读取
	  	getValue=function(){
	  		return n;
	  	};
	  	setValue=function(x){
	  		n=x;
	  	}
	  })();
	  alert(getValue());  // 0
	  setValue(567);
	  alert(getValue()); //567

 迭代器中的应用:

 //迭代器中的应用
	 function test(x){
	 	var i=0;
	 	return function(){
	 		return x[i++];
	 	};
	 }
	 var next=test(['a','b','c','d','e']);
	 alert(next());   //a
	 alert(next());   //b
	  alert(next());  //c
	   alert(next());   //d

 //循环中的应用:

             function f(){
	  	var a=[];
	  	//应用了该值得指向
	  	var i;
	  	 for(i=0;i<3;i++){
	  	 	a[i]=function(){
	  	 		return i;
	  	 	}
	  	 }
	  	 return a;
	  }
	  var test=f();
	  alert(test[0]());    //3
	   alert(test[1]());  //3
	    alert(test[2]());  //3
   function f(){
	    	var a=[];
	    	 var i;
	    	for(i=0;i<3;i++){
	    		//创建自调用的函数
	    		a[i]=(function(x){
	    			return function(){
	    				return x;
	    			}
	    		})(i);
	    	}
	    	return a;
	    }
	   
	    var test=f();
	  alert(test[0]());    //1
	   alert(test[1]());  //2
       alert(test[2]());    //3
  //中间变量
       function f(){
       	function test(x){
       		return function(){
       			return x;
       		}
       	 }
       	var a=[];
        var i;
       for(i=0;i<3;i++){
       	a[i]=test(i);
       }
       return a;
       }
       var res=f();
       alert(res[0]());
        alert(res[1]());
         alert(res[2]());
原文地址:https://www.cnblogs.com/sunliyuan/p/6266469.html