zoukankan      html  css  js  c++  java
  • 匿名函数和闭包

    一.匿名函数

    把匿名函数赋值给变量

    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 " 运行中”;
    
         }
    
    }
    

      

  • 相关阅读:
    Java常用API(Arrays类)
    Java常用API(String类)
    Java常用API(Random类)
    Java匿名对象介绍
    Qt串口实现921600波特率的方法
    Qthread实现多线程操作
    小品QIODevice::Text参数
    Qt串口通信
    Linux下挂载新的磁盘
    互斥锁陷阱:优先级反转、死锁
  • 原文地址:https://www.cnblogs.com/france-008/p/5839973.html
Copyright © 2011-2022 走看看