JavaScript闭包

闭包

  • 函数嵌套函数, 内部函数可以引用外部函数的参数和变量(突破作用域链), 参数和变量不会被垃圾回收机制回收
    可以理解为是联系函数内部和函数外部的桥梁
  • 注意:
    • 闭包会使得函数中的变量都被保存在内存中, 内存消耗很大, 所以不能滥用闭包, 否则会造成网页的性能问题. 尽量在退出函数之前, 将不使用的局部变量全部删除
    • 闭包会在父函数外部改变父函数内部变量的值, 所以如果把父函数当做对象(object)使用, 把闭包当做它的公用方法, 把内部变量当做它的私有属性, 这时不要随便改变父函数内部变量的值

以下有三种方式:

  • 直接定义函数
  <script>
    function aaa(a){
      var b = 5;
      function bbb(){
        a++;
        b++;
        alert(a);
        alert(b);
      }
      // 返回内部函数
      return bbb;
    }
    var ccc = aaa(10);
    ccc();    //弹出11, 6

  </script>
  • 直接返回函数
  <script>
    function a(){
      var num = 10;
      return function(){
        return num+1;
      }
    }
    var aa = a();
    alert(aa());    // 弹出11

  </script>


  • 把内部函数赋给变量
  <script>
    function a(){
      var num = 10;
      b = function(){
        return num+1;
      }
    }
    a();
    alert(b());    // 弹出11

  </script>


  • 混合使用
  <script>
    function f1(){
      var n=1;
      test=function(){
        n+=1;
      };
      function f2(){
        alert(n);
      };
      return f2;
    }
    var res=f1();
    res();    // 弹出 1
    test();
    res();    // 弹出 2
  </s
  • 迭代计数
  <script>
    function test(x){
      var i=0;
      var demo=function(){
        return(x[i++]);
      }
      return demo;
    }
    var next=test(['a', 'b', 'c', 'd']);
    alert(next());    // a
    alert(next());    // b
    alert(next());    // c
    alert(next());    // d
  </script>
posted @ 2016-10-02 16:48  qlshine  阅读(134)  评论(0编辑  收藏  举报