闭包(Closure)

可以保留局部变量不被释放的代码块,被称为一个闭包

闭包的概念比较抽象,相信大家都或多或少知道、用到这个特性

那么闭包到底能给我们带来什么好处?

先来看一下如何创建一个闭包:

 
// 创建一个闭包
function makeCounter() {let k = 0;return function() {return ++k;};
}const counter = makeCounter();console.log(counter());  // 1
console.log(counter());  // 2

makeCounter 这个函数的代码块,在返回的函数中,对局部变量 k ,进行了引用,导致局部变量无法在函数执行结束后,被系统回收掉,从而产生了闭包。而这个闭包的作用就是,“保留住“ 了局部变量,使内层函数调用时,可以重复使用该变量;而不同于全局变量,该变量只能在函数内部被引用。

换句话说,闭包其实就是创造出了一些函数私有的 ”持久化变量“。

所以从这个例子,我们可以总结出,闭包的创造条件是:

  1. 存在内、外两层函数
  2. 内层函数对外层函数的局部变量进行了引用

闭包的用途

闭包的主要用途就是可以定义一些作用域局限的持久化变量,这些变量可以用来做缓存或者计算的中间量等等。

 
// 简单的缓存工具
// 匿名函数创造了一个闭包
const cache = (function() {const store = {};return {get(key) {return store[key];},set(key, val) {store[key] = val;}}
}());cache.set('a', 1);
cache.get('a');  // 1

上面例子是一个简单的缓存工具的实现,匿名函数创造了一个闭包,使得 store 对象 ,一直可以被引用,不会被回收。

闭包的弊端

持久化变量不会被正常释放,持续占用内存空间,很容易造成内存浪费,所以一般需要一些额外手动的清理机制。

摘选自:http://taobaofed.org/blog/2017/03/16/javascript-functional-programing/

什么是闭包(Closure)?相关推荐

  1. Scala编程之闭包(closure)

    一.概念 闭包:我们把一个函数与其相关引用环境(变量)组合成一个整体叫做闭包 概念晦涩难懂,下面我们用一个例子说明 二.小例子 def minusxy(x:Int) = (y:Int)=>x-y ...

  2. [转载]深入理解JavaScript闭包(closure)

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  3. 【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )

    文章目录 一.闭包的代理策略引入 二.闭包的四种代理策略 一.闭包的代理策略引入 分别在 Groovy 脚本 和 Test 类中定义 fun 方法 , 打印不同的内容 ; 在闭包 Closure 中分 ...

  4. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )

    文章目录 总结 一.闭包类 Closure 简介 二.闭包类 Closure 中 this.owner.delegate 成员 源码分析 三.分析编译后的字节码文件内容 总结 在闭包中 , 打印 th ...

  5. 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

    文章目录 一.闭包参数绑定 1.闭包参数绑定 curry 函数 2.闭包参数绑定 rcurry 函数 3.闭包参数绑定 ncurry 函数 二.完整代码示例 一.闭包参数绑定 闭包 Closure 提 ...

  6. 【Groovy】闭包 Closure ( 闭包参数列表规则 | 默认参数列表 | 不接收参数 | 接收自定义参数 )

    文章目录 一.闭包参数列表 二.闭包参数列表代码示例 一.闭包参数列表 闭包的参数设置有如下情况 : 不接收参数 : 如果在定义闭包时 , 只写了 " -> " 符号 , 没 ...

  7. 【Groovy】闭包 Closure ( 闭包调用 | 闭包默认参数 it | 代码示例 )

    文章目录 一.调用闭包 二.闭包默认参数 it 三.代码示例 一.调用闭包 执行 Closure 变量 的 call() 方法 , 可以调用该闭包 ; // 定义闭包变量def closure = { ...

  8. 【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )

    文章目录 一.闭包定义 二.闭包类型 三.查看编译后的字节码文件中的闭包类型变量 一.闭包定义 闭包 Closure 是 Groovy 中最常用的特性 , 使用闭包作为参数是 Groovy 语言的明显 ...

  9. Kettle使用_16 闭包Closure Generator树形数据

    Kettle使用_16 闭包Closure Generator树形数据 需求: 通过Kettle的组件实现对树形结构数据的深度(层次)的生成. 解决方法:结合闭包Closure Generator.排 ...

  10. javascript中的闭包closure详解

    文章目录 简介 函数中的函数 Closure闭包 使用闭包实现private方法 闭包的Scope Chain 闭包常见的问题 闭包性能的问题 总结 简介 闭包closure是javascript中一 ...

最新文章

  1. UC伯克利最新深度强化学习课程上线,视频已上传到B站
  2. JVM-class文件完全解析-方法表集合
  3. 1.01 与 37.8
  4. cuda nvcc版本不一致_入坑第一步:Win10安装cuda+cuDNN+TensorFlow-GPU走过的那些路
  5. Detected call of `lr_scheduler.step()` before `optimizer.step()`.
  6. 机器学习爬大树之(GBDT原理)--二分类篇
  7. 字节JAVA研发面试
  8. a标签的href属性
  9. 实验七 数据选择器和译码器的应用
  10. Python机器学习之决策树(使用西瓜数据集构建决策树,并将其可视化,graphviz程序下载)
  11. 微信没有回车键怎么换行_怎么换行-回答 | 为什么苹果的微信没有换行键,想换行怎么办?...
  12. ucore lab2
  13. 鼠标式光流传感器与多传感器融合
  14. 1088: 手机短号 (多实例)C语言
  15. uni-app如何自定义内容生成二维码?
  16. 深入理解java虚拟机 (周志明)JVM个人总结
  17. 计算机应用基础第1版前言,《计算机应用基础课件》前言
  18. 你是个年轻人,请你好好生活
  19. 中国地址选择xml 文件
  20. DS||dfs and bfs

热门文章

  1. C语言:strdup函数的使用
  2. Excel 2010迷你图,单元格中的图表
  3. 1 数据分析 概述 Excel操作基础
  4. VS CODE 离线插件下载
  5. 【React Native】豆瓣同城 DCity 项目
  6. CTF-1 cat’s gift
  7. javascript中定位父级offsetParent 及偏移大小
  8. 公司入职时签订的保密协议和不竞争协议
  9. iPhone 自带邮箱配置 QQ 邮箱、QQ 企业邮箱
  10. 员工礼仪培训材料~~精确到如何接电话、如何用餐、如何坐电梯