.
什么是闭包
什么是闭包?闭包的优缺点?这已经是前端开发人员老生常谈的了;闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。
要理解闭包,首先要理解javascript的特殊的变量作用域。
变量的作用域无非就两种:全局变量和局部变量。
javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。
注意点:在函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明的是一个全局变量!
不用说我们对JavaScript的变量作用域都甚是了解吧,那么如何从外部读取函数内部的局部变量?
出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现。那就是在函数内部,再定义一个函数。
(function fun(){
var a=1;
function fun2(a){
a++;
var b=1;
return function(){
b++;
var c=0;
return c+=a+b
}
}
var fun3=fun2(a)
console.log(fun3()) //4
console.log(fun3()) //5
console.log(fun3()) //6
console.log(fun3()) //7
})();
在以上闭包函数代码中:
函数 fun 包含 函数 fun2 又包含 返回函数
*子函数可以获取父级函数的变量,反过来就不能获取到了,那么我 return 子函数,父级函数不是就能获取到子函数的变量了吗~ *
这就是Javascript语言特有的"链式作用域"结构(chain scope)
那么,总结下什么是闭包呢?
我个人理解: 从函数外部可以调用函数内部变量的函数,就叫做闭包函数
闭包的用途
- 可以读取函数内部的变量
- 让这些变量的值始终保持在内存中,不会在函数调用后被自动清除
用途二为什么会这样呢?
原因就在于fun2是返回函数的父函数,而fun2被赋给了一个全局变量,这导致fun2始终在内存中,而fun2的存在依赖于子函数,因此子函数也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
举个反向栗子
有一个附属卡(父级函数),有一个主卡(子函数),因为附属卡正常,主卡就一定是正常的(存在的),所以,不会在附属卡用了之后,主卡就不能用了。
至于我为什么这么比喻,我是这么理解的:
父级函数和 return 的子函数是相辅相成的,可以互相获取对方的局部变量,这就形成了闭包
以上是闭包的学习心得,如有不妥,请指正,谢谢。
.
.
.
.