当前位置: 首页 > news >正文

闭包得从底层理解

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

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

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

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

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

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

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

相关文章:

  • Linux wget auto login and backup database
  • Vue组件里的data为什么是函数,而不是对象
  • webpack的理解和使用
  • Building a RESTful Web Service(转)
  • Uncaught SyntaxError: Unexpected token ‘<‘完美解决
  • oVirt (Open Virtual) 之 VDSM 学习笔记 (二) 流程追踪
  • 完美解决[webpack-cli] Unable to load ‘@webpack-cli/serve‘ command
  • HTTP相关概念
  • 原型与原型链的底层理解
  • 浅谈promise
  • 变更管理、信息系统安全管理及项目风险管理作业
  • promise 的基本概念
  • Android 学习之drawerlayout写侧滑菜单
  • 使用Promise按顺序读取文件内容
  • Promise 封装读文件的方法
  • co模块的前端实现
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js面向对象
  • Meteor的表单提交:Form
  • mysql innodb 索引使用指南
  • Next.js之基础概念(二)
  • PHP的类修饰符与访问修饰符
  • python3 使用 asyncio 代替线程
  • Spark RDD学习: aggregate函数
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vue2 SSR 的优化之旅
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • WinRAR存在严重的安全漏洞影响5亿用户
  • yii2权限控制rbac之rule详细讲解
  • 诡异!React stopPropagation失灵
  • 猴子数据域名防封接口降低小说被封的风险
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 力扣(LeetCode)357
  • 码农张的Bug人生 - 初来乍到
  • 前端技术周刊 2019-02-11 Serverless
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 微信小程序设置上一页数据
  • 我是如何设计 Upload 上传组件的
  • scrapy中间件源码分析及常用中间件大全
  • 回归生活:清理微信公众号
  • ​【已解决】npm install​卡主不动的情况
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ${ }的特别功能
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (9)目标检测_SSD的原理
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (done) 两个矩阵 “相似” 是什么意思?
  • (二)丶RabbitMQ的六大核心
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424