闭包得从底层理解

咱们开门见山从底层谈起,让你理解更透彻,简单

这篇博客不会像别的作者写的那样晦涩难懂,让你学完闭包感觉晕头转向,而是真正从底层去理解闭包,享受闭包的快乐

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里没有私有变量这个概念,必须要用到闭包,因为闭包后,变量只能自己使用,这就相当于私有化了,所以实现了数据的隐藏和封装

理解力更强的同学可以通过下面这个例子参考下:

大家看到结果之后,是不是发现各个变量互不干扰

这就实现了数据的隐藏和封装

 好了,上面就是我个人对闭包的所有理解了,如果还有疑惑,可以在评论区交流,探讨

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值