一、概念
一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
简单来说,就是内层函数能调用外层函数的变量
闭包 = 内层函数 + 外层函数变量
二、作用
封闭数据,提供操作,让外部也可以访问函数内部的变量。
三、使用
简单例子:
function outer() {
const a = 1;
function fn() {
console.log(a);
}
f();
}
outer();
结果:
上面的例子中,内层函数 fn()
能调用外层函数的变量 a
,这就是一个简单的闭包。
常见形式(外部
可以使用函数内部
的变量):
function outer() {
const a = 10;
function fn() {
console.log(a);
}
return fn;
}
const fun = outer();
fun();
简约写法:
function outer() {
const a = 10;
return function () {
console.log(a);
};
}
const fun = outer();
fun();
结果:
上面的例子中,
外部
的函数调用了内部
函数的变量,也是闭包。
四、应用
实现数据的私有
例如,统计调用函数的次数:
let count = 0;
function fn() {
count++;
console.log(`函数被调用了${count}次`)
}
fn();
能实现,但是变量count
是全局的,容易被篡改,使用闭包后:
function fn() {
let count = 0;
return function () {
count++;
console.log(`函数被调用了${count}次`)
}
}
const fun = fn();
fun();
就能实现变量的私有,但是count
作为局部变量,在使用完后应该被回收,但却没被回收,所以造成了内存泄漏。