什么是闭包
概念定义说法非常多,先写一个纯正闭包
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c();
这个函数有几个特点:
1、函数b
嵌套在函数a
中;
2、函数a
返回函数b
。
当函数a
的内部函数b被函数a
外的一个变量引用的时候,就创建了一个闭包。
函数的执行过程:
1、在var c = a();
执行了a函数,那么肯定a
经过了return
,按照主流语言的函数特性,现在c
的值就是a
的返回值。
2、在c();
的执行实际执行的就是b函数,最后不管执行的是谁,会弹出一个值为1的窗口,到此为止,所有的生命周期按理论来说就算全部结束了,可是,如果我们再多执行一行var c = a();c();c();
,第一次弹出1
,第二次执行却弹出了2
。
3、也就是说,第一次c();
后,a
中的i
依然保留,自然a
在内存的栈区依然保留。a
是return
过了,但是,a
及内部值却依然存在,这就是闭包。
闭包特性
- 闭包外层是个函数
- 闭包内部存在函数
- 闭包会返回内部函数
- 闭包返回的函数的内部不能有返回值(因为这样就真的结束了)
- 执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在
闭包作用
闭包的作用就是在
a
执行完并返回后,闭包使得JavaScript的垃圾回收机制GC不会收回a
所占用的资源,因为a
的内部函数b
的执行需要依赖a
中的变量。(这个还是需要进一步再了解,感觉还不够严谨,之后的学习会继续更新)