一、概念

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

二、特性

  1. 函数嵌套函数

  2. 函数内部可以引用函数外部的参数和变量

  3. 参数和变量不会被垃圾回收机制回收

三、用法

1. 函数作为返回值

function closure(num) {var count = num// t()使用// return function getCount() {//   return count++// }return {plus: function() {return count++},minus: function() {return count--},getCount: function() {return count}}
}
var t = closure(0)
console.log('初始值:' + t.getCount())
t.plus()
console.log('plus后:' + t.getCount())
t.minus()
console.log('minus后:' + t.getCount())

(1)经典例子-定时器与闭包

1.1 实现依次输入0 1 2 3 4
for (var i = 0; i < 5; i++) {// var则输出5个5,改成let按顺序输出0-4setTimeout(() => {console.log(Date.now() + ' ' + i)}, 100)
}

1.2 引入闭包来保存变量j,将setTimeout放入立即执行函数中,将for循环中的循环值j作为参数传递,100毫秒后同时打印出0 1 2 3 4
for (var j = 0; j < 5; j++) {(function(j) {setTimeout(() => {console.log(Date.now() + ' ' + j)}, 100)})(j)
}

1.3 那如果我们想实现每隔100毫秒分别依次输出数字,又该怎么改呢?
for (var k = 0; k < 5; k++) {(function(k) {setTimeout(function() {console.log(Date.now() + ' ' + k)}, 100 * k)})(k)
}

k*100是为4个定时器分别设置了不同的时间,同时启动,但是执行时间不同,每个定时器间隔都是100毫秒,实现了每隔100毫秒就执行一次打印的效果。

2. 闭包作为参数传递

 // 第一种写法function fun2() {var num = 24console.log(++num)}function fun1(fun) {fun()}fun1(fun2)// 输出结果// 25// 第二种写法(匿名函数回调)void (function(fun) {fun()})(fun2)// 输出结果// 25

总结:

优点:
  1. 可以访问到函数内部的局部变量
  2. 可以避免全局变量的污染
  3. 这些变量的值始终保持在内存中,不会在外层函数调用后被自动清除。
缺点:
  1. 会增大内存使用量,滥用闭包会影响性能,导致内存泄漏等问题。
注意:在退出函数之前,将不使用的局部变量全部删除,可以使变量赋值为null。

什么是闭包和如何使用闭包?相关推荐

  1. Go 学习笔记(18)— 函数(04)[闭包定义、闭包修改变量、闭包记忆效应、闭包实现生成器、闭包复制原对象指针]

    1. 闭包定义 Go 语言中闭包是引用了自由变量的函数,被引用的自由变量和函数一同存在,即使已经离开了自由变量的环境也不会被释放或者删除,在闭包中可以继续使用这个自由变量,因此,简单的说: 函数 + ...

  2. Swift--逃逸闭包与非逃逸闭包(Swift3.1)

    逃逸闭包和非逃逸闭包的理解: Swift中的闭包有两种:逃逸闭包和非逃逸闭包.逃逸闭包表示闭包将在函数返回之后执行:而非逃逸闭包则表示在函数返回前,即函数内部执行. 那么我们是否可以理解为:如果闭包作 ...

  3. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )

    文章目录 一.闭包类 Closure 简介 二. 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 三. 完整代码示例 一.闭包类 Closure ...

  4. 【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )

    文章目录 一.自定义闭包参数列表 1.定义一个自定义参数的闭包 2.定义多个自定义参数的闭包 3.为闭包参数指定默认值 二.完整代码示例 一.自定义闭包参数列表 如果要向 闭包 中 , 传递多个参数 ...

  5. python的闭包要素_Python的闭包

    我的理解,Python中的闭包和其他语言中的闭包一样,都是在一个函数中返回另一个函数.def out_fun(num): print('------1-----') def in_fun(in_num ...

  6. javascript闭包_JavaScript闭包教程–带有JS闭包示例代码

    javascript闭包 Closures – many of you JavaScript devs have probably heard this term before. When I sta ...

  7. python 闭包_Python中的闭包

    一.什么是闭包 在谈之前,我们先来说说作用域,变量的作用域无非就两种:全局变量和局部变量.函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量.出于种种原因,我们有时候需要获取到函数 ...

  8. python闭包怎么理解_Python 闭包的理解

    Last Updated on 2019年10月15日 Python中的闭包是一个比较模糊的概念,不太好理解,我最近的面试中也被问及,在一个单例模式的实现上,我用装饰器实现单例,然后面试官就问到了我对 ...

  9. 为什么一个程序中变量只能定义一次_什么是闭包?为什么叫闭包?

    <JavaScript ES6 函数式编程入门经典>4.1理解闭包: 简言之,闭包是一个内部函数.那么什么是内部函数呢?它是在另一个函数内部的函数.比如: function outer() ...

  10. php的闭包函数bingto_php的闭包

    闭包是指在创建时封装周围状态的函数,即使闭包所在的环境的不存在了,闭包中封装的状态依然存在. 匿名函数其实就是没有名称的函数,匿名函数可以赋值给变量,还能像其他任何PHP函数对象那样传递.不过匿名函数 ...

最新文章

  1. mysql 分组取最新的一条记录(整条记录)
  2. 如何解决div里面img图片下方有空白的问题?
  3. 如何让SD-WAN超越MPLS?
  4. P4127 [AHOI2009]同类分布
  5. 构建闭环式的研发运维体系----云效EDAS DevOps
  6. 循环语句与条件语句_在PHP中混合条件语句和循环
  7. 深度学习中防止过拟合的方法
  8. 想学 AI,先搞懂这件小事!
  9. 如何直观理解拉格朗日乘子法与KKT条件
  10. 拓端tecdat|回归树模型分析纪录片播放量影响因素|数据分享
  11. 微型计算机主机作用,微型计算机的主机包括()。
  12. 玩转基金(1)基金基础
  13. linux下画pcb的软件,Linux下画原理图和PCB
  14. java 生成 pdf 标题 表格 注释 合并
  15. xp 64位系统下载
  16. 上海链家二手房交易数据分析
  17. 服务器不能用pe安装win7系统安装,使用PE安装win7系统失败了怎么办
  18. 集成第三方SDK——支付宝支付
  19. 解决win7打开网络看不到局域网的其他电脑/计算机
  20. ez4w.com的5折优惠码

热门文章

  1. (已更新)2023全新SF授权系统源码 V3.7全开源无加密版本
  2. github 删除仓库
  3. [win转mac]-mac安装autojump
  4. 软考高级-信息系统管理师之安全管理(最新版)
  5. mysql导入表数据方法_mysql数据导入导出方法总结
  6. Cloud Native Weekly | 华为云抢先发布Redis5.0,红帽宣布收购混合云提供商 NooBaa
  7. 出海淘金成必然,中东10大短视频应用9个“中国造”
  8. NFTScan 与 Bulletime 在 NFT 底层数据方面达成战略合作
  9. SQL学习九、子查询
  10. 课程格子-斐波那契数列笔试题目-被拒原因?