关于闭包

什么是闭包

闭包就是能够读取其他函数内部变量的函数。在 JS 中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解为”定义在一个函数内部的函数”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function fn() {
let b = 1;
//闭包
function box() {
console.log(b);
}

//返回一个函数,这个函数就是一个闭包
return box;
}

//res 就是 box 函数
let res = fn();

//2秒以后调用res函数,还是能打印b的值,闭包能让局部变量常驻内存
setTimeout(function () {
res();
}, 2000);

闭包的特点

  1. 可以读取函数内部的变量。
    变量的作用域无非就是两种:全局变量和局部变量。
    JS 语言的特殊之处,就在于函数内部可以直接读取全局变量。另一方面,函数外部自然无法读取函数内的局部变量。
  2. 让这些变量的值始终保存在内存中。

闭包的应用场景

  1. 函数作为返回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function box() {
let n = 1;
function cox() {
n++;
return n;
}

return cox;
}
//res 就是一个闭包 ,n像是一个全局变量
let res = box();

console.log(res()); //2
console.log(res()); //3
  1. 函数作为参数被传递
    回调函数

闭包深度解析参考

阮一峰博客:学习 Javascript 闭包(Closure)