浅谈“闭包”,简单理解“闭包”
一、理解闭包的涵义
闭包,是函数的一种高级应用,总结一句话“函数内部的函数”
例子:
二、闭包的使用
想要使用“闭包”必须满足三个条件
- 在 A函数 返回 (return) 一个 B函数
- B函数 必须 引用 A函数的私有变量
- A函数的外部有一个变量接收 B函数
例子:
三、闭包的主要作用
分为两点
- 延长变量的生命周期
- 使之可以访问函数内部的私有变量
何谓 变量的生命周期?
在内存中, 分为栈和堆, 函数的调用, 存储在栈内, 而函数体存储在堆中。当你调用函数的时候,函数会开辟一个“函数执行空间”。对于这个执行空间的存在,只是短暂性。函数在执行完毕后,该函数执行空间,将会即刻销毁,故变量,也不再存在。由此看,变量的生命周期,从赋值开始,终止于完成函数执行。
为延长变量生命时间,就开始运用“闭包”。“闭包”在内存中将会为函数开辟并占据一定的空间,该函数的执行空间,并不会,因为代码执行完毕,就即刻销毁。
在函数中,函数内部的变量,称之为“私有变量”,在函数外部不得访问。在“闭包”中,函数内部返回函数,从上例解释,fn 接收了A函数的返回结果,fn 就等同于B函数。fn() 调用执行,则为 B函数执行。而B函数的变量(形参)也是A函数的私有变量。由此,看作是,访问了A函数的私有变量。
四、闭包的特点
“闭包” 特点 总结为两点
- 巧妙运用 “全局 、局部” 变量
- 垃圾回收机制
从上例子分析,A函数的变量a(形参a),对于 页面而言是 私有变量,与此同时, A函数的变量a 是 B函数的全局变量。也正因为这一特点,因为fn 作为变量接收着A函数的返回结果(B函数),而B函数使用着A函数的变量,由此使之函数执行空间,不被销毁。
但是,由于“闭包”一直占据着内存中的特有空间,故而为稍减内存空间压力,垃圾回收机制,也显得极为重要。
垃圾回收机制,顾名思义而得,销毁不被使用的变量。在闭包中,不会再被使用变量就将被销毁。销毁方式主流分为标记清除发和引用清除法。 - 标记清除法
在一个函数中声明一个变量,就将这个变量标记为"进入环境",而当变量不再使用时,则将其标记为"离开环境"。离开之后,就会被销毁。 - 引用清除法
语言引擎有一张"引用表",保存了内存里面所有资源(通常是各种值)的引用次数。如果一个值的引用次数是0,就表示这个值不再用到了,因此就将被销毁,用于释放占用的内存空间。
五、闭包致命缺点
对于闭包而言,最大的优点同时也是其最致命的缺点。闭包单独占据内存的一部分空间,使之函数执行空间,不会销毁。与此同时,能够使用的内存空间减少,这意味着,内存不足,将会卡顿,严重之时,将会导致“内存泄漏(系统崩溃)”。
六、升级理解