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

闭包--循序学习

感觉似懂非懂的概念,这里记录理解进程。

1.javascript的闭包

参考:百度百科。

什么是闭包
“官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
相信很少有人能直接看懂这句话,因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包,因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段

代码

1
2
3
4
5
6
7
8
9
function  a(){
var  i=0;
function  b(){
alert(++i);
}
return  b;
}
var  c=a();
c();

特点

这段代码有两个特点:
1、函数b嵌套在函数a内部;
2、函数a返回函数b。
这样在执行完var c=a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

作用

简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制 GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程。
在上面的例子中,由于闭包的存在使得函数a返回后,a中的i始终存在,这样每次执行c(),i都是自加1后alert出i的值。
那 么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被 GC回收。(关于Javascript的垃圾回收机制将在后面详细介绍)




唯有不断学习方能改变! -- Ryan Miao

相关文章:

  • 【MVCMVPMVVM】
  • 【内存泄露】
  • 默认input=file样式美化的bug及解决
  • 【进程间通信】
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Android知识点总结
  • 无锁和无等待的定义和例子
  • Leetcode Hot100
  • SpringMVC 源码深度解析lt;context:component-scangt;(扫描和注冊的注解Bean)
  • Django中render_to_response和render的区别(转载)
  • 【烈日炎炎战Android】
  • BZOJ 3168 Heoi2013 钙铁锌硒维生素 矩阵求逆+匈牙利算法
  • 【自定义view-水波纹动画】
  • android studio 修改gradle引用本地文件
  • 【烈日炎炎战后端】JAVA基础(3.4万字)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • angular2开源库收集
  • Apache的基本使用
  • create-react-app做的留言板
  • IDEA 插件开发入门教程
  • input实现文字超出省略号功能
  • Intervention/image 图片处理扩展包的安装和使用
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java小白进阶笔记(3)-初级面向对象
  • jQuery(一)
  • Mybatis初体验
  • MySQL QA
  • React-redux的原理以及使用
  • spring security oauth2 password授权模式
  • XML已死 ?
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 测试如何在敏捷团队中工作?
  • 分布式熔断降级平台aegis
  • 记录一下第一次使用npm
  • 聊聊flink的BlobWriter
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深度学习在携程攻略社区的应用
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序button引导用户授权
  • nb
  • Java总结 - String - 这篇请使劲喷我
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #HarmonyOS:基础语法
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (TOJ2804)Even? Odd?
  • (多级缓存)多级缓存
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (力扣)1314.矩阵区域和