闭包能延长变量存活时间,关键在于内部函数持续持有对外部函数局部变量的引用,阻止垃圾回收;需满足函数嵌套、内部函数引用外部变量、外部函数返回该内部函数三个条件。

闭包能延长变量存活时间,关键在于内部函数持续持有对外部函数局部变量的引用,阻止 JavaScript 引擎在外部函数执行完毕后回收这些变量。
变量本该被销毁,但闭包拦住了垃圾回收
函数执行结束时,其执行上下文通常被销毁,内部声明的局部变量也随之释放。但若该函数返回了一个内部函数,且这个内部函数引用了外部函数的变量,引擎就会保留这部分内存——因为变量还在被使用。
- 变量不是“永久存在”,而是只要闭包函数还存在(有引用),它就一直保留在内存中
- 一旦闭包函数本身变成垃圾(比如被赋值为 null 或脱离作用域),变量才可能被回收
- 常见误判:不是外部函数执行完就生成闭包,而是在内部函数定义时就已形成闭包结构
典型结构:返回函数 + 引用外部变量
下面这段代码清晰展示了变量 count 如何被“留住”:
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter(); // 此时 count 并未消失
console.log(counter()); // 1
console.log(counter()); // 2
每次调用 counter(),实际执行的是那个内部匿名函数,它始终能读写 createCounter 中的 count。
闭包延长生命周期的三个必要条件
- 必须有函数嵌套:内部函数在外部函数体内定义
- 内部函数必须引用外部函数的局部变量(或参数)
- 外部函数必须返回该内部函数(或以其他方式让其逃逸出当前作用域)
注意:不是所有嵌套都自动产生有效闭包
如果内部函数没被返回、也没被保存到全局或其它长期存活的作用域里,即使它引用了外部变量,变量仍会在外部函数结束时被释放。
- 错误示例:function fn() { let x = 1; function inner() { console.log(x); } inner(); } —— inner 执行完即销毁,x 不会延长存活
- 正确示例:function fn() { let x = 1; return function() { console.log(x); }; —— 返回后被赋值给变量,x 持续存活
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











