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