闭包 —JavaScript面向对象高级

# 闭包 #

  我的理解:面试时,先说作用域链,再说闭包产生的原因,然后是垃圾回收GC,最后说闭包。

       a.一个函数内部声明的变量,就是它的私有变量.
       b.在javascript中特性中,函数是可以访问它所在作用域链的所有变量.
       c.但函数外部是不能直接访问函数内部的私有变量
       D.通过函数内部再嵌套函数,子函数返回父函数的变量,就创建了一个闭包。

闭包的表现形式

  模块化的本质:是通过函数的局部作用域特性来产生局部上下文来保存局部变量 

  1.函数作为返回值

        function fn(){
          var count = 0;
          return function(){  //这句话是重点
             count++;
             console.log(count)
          }
       }

        var a = fn()
        a();  //1
        a();  //2
        a();  //3
        a();  //4    //a作为变量,是对fn()的引用,所以fn一直没被释放
        a = fn()     //对a重新赋值,重新把fn的引用给a 所以中间释放过
        a();  //1     

  2.函数当做参数传递
       
           var max = 10;
           var fn =function(x){
              if(x>max){
                console.log(x)
              }
           }//max是自由变量,在fn定义好后就固定,所以max =10
           
           function fn1(f){
            var max = 100;
            f(15);
           }
        
           fn1(fn) //15


  3.信息暴露和隐藏
        
        function fn(){
         var a = 10;
         var  b = [1,2,3,4];
         var count = 0;
         function addCount(){
             count++
         };
         function getCount(){
            return count;
         }
    
         return {
           add:addCount,
           get:getCount
         }
       //这里暴露出去的对象,只有两个方法,而私有变量a 和 b没有暴露,所以是保密的,可以选择性的暴露    ————模块化 seajs就是这样实现
       }
        var  a = fn(); //将引用给a

   4.异步回调
       
       
    // 闭包——异步回调
         function fn(){
             var i = 0;
             window.setInterval(function(){
                  console.log(i++)
             },1000);
             console.log('prevent')   
         }
         fn()
     
      注意:setInterval()是典型的异步,fn在执行后,打印出'prevent',然后应该fn调用完成被销毁,但是定时器依然在执行,所以fn依然还在。  
       

posted on 2016-12-05 22:53  唐小青  阅读(340)  评论(0编辑  收藏  举报

导航