闭包得从底层理解
咱们开门见山从底层谈起,让你理解更透彻,简单
这篇博客不会像别的作者写的那样晦涩难懂,让你学完闭包感觉晕头转向,而是真正从底层去理解闭包,享受闭包的快乐
1.从作用域说起
先要区分全局变量和局部变量
全局变量和局部变量从出生,他们就是两个世界的。有同学说,不都是变量吗,这有啥区别呀。就好比,咱们普通人和思聪gg,他一出生就能开的起劳斯莱斯,普通人可能摸都没摸过,对就是我
记住,这个理解很关键,为下文理解做铺垫
Script翻译为全局的,Local翻译为局部的
全局变量a,从一出生就被放在Script中;而局部变量b,放在Local
这两个有区别:
放在Script中的,不会被垃圾回收机制销毁
放在Local中的,因为程序放在浏览器运行,会生成AO(js的临时活动对象),程序运行的时候,AO就会存储方法及里面的变量。方法执行完成后,就会被垃圾回收清理,回收。
注意: AO 是 Active Object 的简写,这样说大家似乎明白了吧
所以说,局部变量b在程序运行完会被销毁,外部自然不能访问
但是内部却能够访问外部的全局变量a,因为a没有被销毁
这里就有个小知识给同学普及一下:
在实际开发过程中,通常不建议定义全局变量,因为常驻内存,会造成变量污染。
2.闭包能延长变量寿命
变量还有寿命?就是变量从创建到被销毁的时间
上面讲到,Local里的局部变量都是会被销毁的,
但闭包能把return后的东西放在{[Scopes]}里面
这里就是理解和原理的精华了:{[Scopes]}为全局作用域属性,包括Script全局和Closure闭包 ,所以,通过闭包变量的寿命就变长了
因为变量从Local住进了{[Scopes]}
下面有图为证:
讲到这里是不是有同学恍然大悟,大喊一声:我悟了.......mmmp.给你来个举一反三
说道:局部变量通过农民翻身做地主,变成了全局变量,住进了{[Scopes]},那我提出了下面的问题
3.A方法能拿到B方法里闭包后的变量吗?
但是,注意!!!不可以的
大家请注意下面两句话
4.闭包的高级用法
到了这里大家应该能理解原理,接下来就是高级用法
我们都知道使用面向对象编程像JAVA有一个好处=>通过私有变量实现=> 数据隐藏和封装
但是javascript里没有私有变量这个概念,必须要用到闭包,因为闭包后,变量只能自己使用,这就相当于私有化了,所以实现了数据的隐藏和封装
理解力更强的同学可以通过下面这个例子参考下:
大家看到结果之后,是不是发现各个变量互不干扰
这就实现了数据的隐藏和封装
好了,上面就是我个人对闭包的所有理解了,如果还有疑惑,可以在评论区交流,探讨