JS闭包理解

2017-08-21  本文已影响0人  xiaoguo16

举一个例子来说明闭包:

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

上一篇下一篇

猜你喜欢

热点阅读