闭包的意义:在不污染全局环境的前提下,使一个变量能够复用。
如何实现闭包:
分三步,第一步把冰箱打开,第二步把大象装进去,第三步关上冰箱-------没有,开个玩笑。
1,外层函数嵌套内层函数
2,内层函数使用外层函数的局部变量
3,把内层函数作为外层函数的返回值
代码示例如下
function xx() {
var a = 1;
return function yy(n) {
a += n
console.log(a)
return a
}
}
xx()(2) // 3
闭包的原理:
在函数调用后,本来是会释放掉局部变量的。但是内层函数使用了某个局部变量的话,那个变量将不能被释放。
要理解闭包的原理,首先要知道函数在创建时会创建两个对象,一个是函数对象本身,另一个是作用域链对象,然后函数调用时,又会生成一个活动对象。
作用域链对象的指针指向了一个栈,这个栈存放着这个函数外层的活动对象,比如上面的代码中,yy函数的作用域栈中,window对象在最下面,然后是xx的活动对象,yy调用后生成的活动对象在栈的最上面。
接着来看一张图——》
此时,内层函数yy的作用域链里面就包含了xx的活动对象,然后xx的活动对象又指向了xx,然后xx又在全局调用了,挂在了全局环境上,然后yy也调用了,这样一来xx,yy,yy的作用域链就形成了一个铁三角,yy和xx都不能被释放了,所以局部变量a就可以复用了。