# 闭包
简单说下什么叫闭包,闭包出现的意义?闭包有哪些用途
# 1. 什么是闭包
根据mdn的定义
- 能够访问自由变量的函数就是闭包
 
什么是自由变量呢?
- 在函数中使用变量,但是该变量不是函数的参数也不在函数中定义
 变量所在的上下文销毁了,依旧可以进行访问
# 2. 闭包的意义
- 闭包有“保护 + 保存”的作用
 - 闭包中的变量是不会被销毁的,所以可以一直进行访问
 - 闭包内的变量,外部访问不到。所以起到了保护的作用
 
function run() {
  let count = 0
  return function () {
    count++
  }
}
const counter = run()
counter() // 1
counter() // 2
 1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10

- 从官方的角度说,上述的实例也算一种闭包的行为
 - 只要是变量在函数中使用,但是又不是函数的参数以及函数中定义,都会形成闭包
 
# 3. 闭包的场景
- 使用闭包封装功能。将部分功能返回供外部使用(
模块化) - 在es6之前没有出现块级作用域。可以使用闭包模拟作用域
 
# 4. 闭包的缺陷以及产生的原因
- 缺陷:
- 过度的使用闭包会造成内存泄露。是因为变量占用内存无法释放
 
 - 原因:
- 遗忘的定时器
 - 使用不当的闭包
 - 遗漏的 DOM 元素
 - 意外的全局变量