关于js闭包的一点认识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33448733/article/details/52065029

什么是闭包?
好吧,这个我看过几次关于闭包的文字描述,但是很遗憾,从没有理解过。所以以下纯属个人理解。
闭包的作用
闭包使函数拥有了私有属性。在js中变量都是有生命周期的,比如函数内的局部变量(在js中只有函数才会创建新的作用域),用过即抛,但是闭包却使函数内的局部变量逃过了GC,但是其变量并不是变成了全局变量,在函数外面无法访问到,其变成了函数专有。
1、从外部拿到其函数内部的变量。
2、使其函数内的变量在函数执行后仍不被回收。

闭包的用法
1、函数作为返回值

这种用法会产生函数执行结束后仍不会被GC回收的变量(至于为什么会这样,这需要了解JS的垃圾回收机制)。
2、函数作为参数被传递
正如之前所说,闭包的功能之一就是从外部拿到函数内部的变量,而这种用法,则是此目的。
总结:
闭包的两个目的前面已经说了,并不是要同时满足以上两个目的就叫做闭包,简单来说能都够沟通函数内外的函数就叫做闭包。

后续

分析一下代码:add是全局变量,它要等上下文环境销毁才销毁。而add又会指向作为返回值的那个代码块,也就是那个闭包,所以闭包一直存在,直到上下文环境销毁, 而闭包会持有父方法的局部变量并且不会随父方法销毁而销毁。所以counter就一直都是那个counter。
说得再直白一点,add是全局变量,所以全局上下文环境还在(代码在运行),add就不会被销毁。而add又指向了那个被作为返回值的闭包,如下图

所以这个闭包也不会被清除。而这个闭包又指向父方法(这么称呼也许不严谨,但为了说明,凑合着用吧)中的counter,所以counter也不会被销毁。所以这个计时器就好了。
至于更深层的理解,则涉及到垃圾回收机制,请恕在下也不甚了解,就不人云亦云了。

猜你喜欢

转载自blog.csdn.net/qq_33448733/article/details/52065029