匿名函数和闭包

一.匿名函数

把匿名函数赋值给变量

var box=function(){

               return 'lee';
}

alert(box());

通过表达式自我执行

(function(){

               return 'lee';
})();


把自我执行后的函数赋值给box;
var box=(function(){
               return 'lee';
})();
alert(box);

二. 闭包

function box (){

  return function(){

             return 'lee';
    }
}

alert(box()());

var b=box();

alert(b()); //更灵活一点

1.通过闭包返回局部变量   (使用闭包有一个优点和缺点 ,就是可以使局部变量驻留在原来的内存中)

function box(){
    var age=100;
    
return  function(){

               return age;

    }


}


  function box(){

     var age=100;
   return function(){

    age ++;
   return age;


     }
}
  
var b=box();
alert(b());
alert(b());    从而实现累加

 


 2.循环里面的匿名函数

function box(){

      var  arr=[];
      for (var i = 0; i < 5; i++) {
           arr[i]=(function(num){
           	    return num;
           })(i);
      }
     return arr;
}

   alert(box());


function box(){

var arr=[];
for (var i = 0; i < 5; i++) {
arr[i]=(function(num){                                                                      驻留在作用域
return num; 
})(i);
}
return arr;
}

var box1=box();
for (var i = 0; i < 5; i++) {
alert(box1[i]);
}



 


3.Javascript 没有块级作用域(模仿块级作用域)

function box(){

      var  arr=[];
      for (var i = 0; i < 5; i++) {
           
      }
     alert(i);                                      仍然可以调用i
}

box();          


包含自我执行的匿名行数 就可以使用块级作用域     私有域控制全局变量  


                        function box(){

                              (function(){
                                   for (var i = 0; i < 5; i++) {

                                  }})();
                                         alert(i);
                     }

                                 box();

                          //包含自我执行的匿名函数就可以实现块级作用域   每个开发者可以使用自己的变量 不会搞坏全局变量

                                私有作用域

                 (function(){

                           var age=100;

                          alert(age);

                       })();

 

                    

 

  关于this对象

在闭包中this指向的是Window

  

var  box ={
          user:'abc',

          getUser:function(){ 
                        
 var   that=this;  return function(){ return this;

return that; } } } alert(box.getUser()()); object window

  解决办法1.对象冒充        alert(box.getUser().call(box)); 否则会发生内存泄漏

     解决办法办法2  var   that=this      

  


私有变量       

 function(){

    var age=100;                 // 私有变量     
        
}

   function Box(){
        
        var age=100;
     function run(){

           return "运行中";  
      }
     this.publicgo=function(){                         //对外可见的公共接口 特权方法

          ruturn age+run();
}
     this.getAge=function(){

          return age;
   }

}
 
   var box=new Box();
  alert(box.getAge());

  


静态私有变量

  共享不同对象的属性,都能访问到被其他对象改变的值

  (function(){
           
        var user=' ';
       Box=function(value){
          
          user=value;
        }//全局构造函数
        
           Box.prototype.getUser=function(){
               return   user; 
   }
     })();


    var box=new Box('lll');
     alert(box.getUser());
   
    var box2=new Box('kkk');
     alert(box.getUser());

  


单例  就是永远只实例化一次 其实就是字面量对象声明方式

  var box={

     user:'lll';

    run:function(){



    return " 运行中”;

     }

}

  

原文地址:https://www.cnblogs.com/france-008/p/5839973.html