定义
闭包(Closure) 是指一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。
如果这句定义太抽象,可以试着这样记忆:
闭包 = 函数 + 该函数定义时的环境
通常情况下,函数执行完毕后,其内部变量会被销毁。但在闭包中,内部函数引用了外部函数的变量,导致这些变量无法被销毁,而是随着内部函数一起存在。
就像一个背包:函数不仅带走了代码逻辑,还把定义时周围需要用到的数据打包带走了。
核心直觉
闭包最核心的作用是延长变量的生命周期和实现数据私有化。
想象一个带有“记忆”的函数:
function createCounter() {
let count = 0; // 这个变量被“封闭”在函数内部
return function() {
count++; // 内部函数引用了外部变量
return count;
};
}
const counter = createCounter();
console.log(counter()); // 输出 1
console.log(counter()); // 输出 2
// 外部无法直接访问 count,只能通过 counter() 操作在这个例子中,createCounter 执行完后 count 本该销毁,但因为返回的函数引用了它,所以它被保留了下来,且只能被该函数访问。