闭包(Closure)


概念:一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域。

简单理解: 闭包 = 内层函数 + 引用的外层函数变量

1
2
3
4
5
6
7
8
function outer(){
const a = 1
function f(){
console.log(a)
}
f()
}
outer()

这段代码能在浏览器显示出闭包结构。

通常会再使用一个函数包裹的闭包结构,以骑到对变量保护的作用。

闭包的应用场景:实现数据的私有。

比如我们要做个统计函数的调用次数,函数就调用一次加加;但是这个count是个全局变量,容易被外部修改;采用闭包的形式实现数据私有,count则不会被外部修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 全局变量
let count = 1
function fn(){
count++
console.log(`函数被调用${count}次`)
}
fn() //2
fn() //3
count = 1000
fn() //1001


// 闭包
function fn(){
let count = 1
function fun(){
count++
console.log(`函数被调用${count}次`)
}
return fun
}

const result = fn()
result() //2
result() //3

A:闭包一定有return吗?

Q:闭包不一定要return。如果外部想要使用闭包的变量,则此时需要return。

A:闭包一定会有内存泄漏吗?

Q:闭包会引起内存泄漏,闭包内部的变量无法被垃圾回收机制释放。但并非所有的内存泄漏都要手动回收,比如react内部很多闭包不能回收。