zoukankan      html  css  js  c++  java
  • 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]());
    
  • 相关阅读:
    HDU5873
    HDU5874
    HDU1565(状态压缩dp)
    POJ2774(二分+哈希)
    HDU4474
    HDU2602(背包)
    单链表
    POJ2503(hash)
    POJ1200(hash)
    顺序表
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/6266469.html
Copyright © 2011-2022 走看看