闭包

作者: Liberty寒风 | 来源:发表于2017-07-02 10:25 被阅读0次

    使变量的值始终保持在内存中

    function f1(){
      var n=999;
      function f2(){
        alert(n++);
      }
      return f2;
    }
    var result=f1();
    result(); // 999
    result(); // 1000
    

    我们在外部调用result函数,可以不断增加内部的n值,实际上函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

    原因: f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

    用闭包模拟私有方法

    var Counter = (function() {
      var privateCounter = 0;
      function changeBy(val) {
        privateCounter += val;
      }
      return {
        increment: function() {
          changeBy(1);
        },
        decrement: function() {
          changeBy(-1);
        },
        value: function() {
          return privateCounter;
        }
      }   
    })();
    alert(Counter.value()); /* 提示 0 */
    Counter.increment();
    Counter.increment();
    alert(Counter.value()); /* 提示 2 */
    Counter.decrement();
    alert(Counter.value()); /* 提示 1 */
    

    JavaScript 并不提供原生的支持,但是可以使用闭包模拟私有方法

    使用闭包的注意点

    • 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    相关文章

      网友评论

          本文标题:闭包

          本文链接:https://www.haomeiwen.com/subject/nbsncxtx.html