闭包是JavaScript中函数与其词法作用域的组合,需满足函数嵌套、内部函数引用外层局部变量、外层函数返回内部函数三条件,可封装私有变量、保持状态、避免全局污染、支持异步回调。
闭包是 JavaScript 中一个函数和它所“记住”的词法作用域的组合。简单说,就是一个内部函数能访问并持续使用外部函数定义的变量,哪怕外部函数已经执行完了。
闭包是怎么形成的
必须同时满足三个条件:
- 函数嵌套:内部函数写在外层函数里面
- 内部函数引用了外层函数的局部变量(不是参数,也不是全局变量)
- 外层函数返回了这个内部函数(或以其他方式让内部函数在外部被调用)
闭包的核心作用
它让局部变量“活”得更久,不被垃圾回收,从而实现几种关键能力:
-
封装私有变量:比如计数器里的
count,外部无法直接修改,只能通过暴露的方法操作 - 保持状态:每次调用闭包返回的函数,都能接着上一次的值继续计算
- 避免全局污染:把变量关在函数里,不会和别的代码抢名字、互相干扰
- 支持回调与异步场景:比如循环中绑定事件,靠闭包能记住每次迭代时的正确值
一个典型例子

下面这段代码就创建了一个闭包:
function createCounter() {let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
这里的 count 是 createCounter 的局部变量,按理说函数一结束就该消失。但它被返回的匿名函数一直引用着,所以保留在内存里——这就是闭包在起作用。
不复杂但容易忽略








