美文网首页
JS闭包理解

JS闭包理解

作者: xiaoguo16 | 来源:发表于2017-08-21 10:12 被阅读0次

    举一个例子来说明闭包:

    function A(){
      var a=0;
      function B(){
          a=a+1;
          console.log(a); 
    }
    return B;
    }
    var m=A();
    var n=m();
    

    上述代码中每次执行m(),a的值都会加1。

    例子的原理

    因为上述代码中当执行A()的时候,此时执行环境为函数A的函数执行环境,作用域链的最前端为A的活动对象,然后是全局变量对象。当函数A执行完毕后,本应该销毁A的活动对象,但因为返回结果为B,也就是此时全局变量m中保存的是函数B,所以把函数B带入了全局环境中,但是B的作用域链需要引用A,所以A的活动对象并没有销毁。当在全局中执行B时,此时的作用域链依次为B的活动对象,A的活动对象,全局活动对象。

    闭包的神奇之处:

    外层的函数执行后,本应该销毁作用域,并且JS的垃圾回收机制将其内存空间进行回收,但是闭包阻止了这件事。因为内层的函数在其词法作用域以外的地方被执行,而其内层函数又需要引用外层函数的作用域,所以外层函数执行后,并没有销毁作用域,垃圾回收机制也没有对内存空间进行回收。

    相关文章

      网友评论

          本文标题:JS闭包理解

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