js中的闭包

  1. 什么是闭包:当内部函数保存到外部时,导致原有的作用域链不被释放,闭包容易造成内存泄露
   function demo(){ //demo()的作用域 demo --[{AO}{GO}] 即自己的作用域和全局的作用域
     var a; 
      function b(){ //b()的作用域 b -- [{AO}{DemoAo}{GO}] 自己的作用域和父级的作用域
          console.log('b')
      }
      return b //内部函数被保存到外部 
   }
   var c = demo()  //正常情况下dmeo()执行完后,AO会被垃圾回收机制回收,但是因为存在b()还在用dmeo()的AO,所以不会被垃圾会收机制给回收
   // c是一个全局的引用,所以只有等到全局结束后demo的Ao才会被释放
   c()  
  1. 闭包的作用
    2.1 实现公有变量的累加
    function demo(){
        var a = 0;
        function test(){
            a ++;
            console.log(a)
        }
        return test
    }
    var c = demo()
    c() //1
    c() //2
    c() //3
    //a 每次执行会在原来的基础上增加一次, 原因是demo的AO,被保存到外部后就不会再次生成,所以c执行都拿着原来的demo的AO在自加

2.2 可以做缓存

   function num(){
             var a = 100;
             function add(){
                 a ++;
                 console.log(a)
             }
             function sub(){
                 a --;
                 console.log(a)
             }
             return [add, sub]
         }
         var demo = num() //说明两个用的是同一个AO
         demo[0](); //101
         demo[1](); //100
         demo[0](); //101

2.3 可以实现封装,属性私有化,模块化开发防止变量污染全局

     (
         function(doc){
            var a = 100; // a就只可以在obj内使用不会污染全局变量
            var obj = {
                add: function(a, b){
                      return a + b
                },
                sub:function(){
                     return a - b
                }
                
            }
            window.obj = obj
         }(1)
     )
  console.log( obj.add(3, 5)) 
posted @ 2019-08-18 18:02  ghostdot  阅读(118)  评论(0编辑  收藏  举报