闭包是外部函数返回内部函数且内部函数访问外部变量,使变量被保留不销毁;需同时满足:有外部函数及局部变量、内部函数被声明、内部函数引用外部变量并返回。

闭包的核心就是:外部函数返回内部函数,且内部函数访问了外部函数的变量,这些变量因此被“保留”下来,不会随外部函数执行结束而销毁。
闭包的形成条件
必须同时满足三点:
- 有一个外部函数,里面定义了局部变量
- 外部函数内部声明了一个函数(内部函数)
- 这个内部函数引用了外部函数的局部变量,并作为返回值被传出
典型写法:返回带状态的计数器
这是最直观的闭包实例,内部变量 count 被内部函数持续持有:
counter.jsfunction createCounter(initial = 0) {<br> let count = initial;<br> return function() {<br> count++;<br> return count;<br> };<br>}
<p>使用时每次调用都生成独立的闭包环境:</p>
<p></p><pre class="brush:php;toolbar:false;">const c1 = createCounter(10);<br>console.log(c1()); // 11<br>console.log(c1()); // 12<br><br>const c2 = createCounter(100);<br>console.log(c2()); // 101<br>console.log(c1()); // 13 ← c1 和 c2 的 count 互不干扰
为什么内部变量没被回收?
因为返回的函数始终“记住”它诞生时的作用域。JavaScript 引擎检测到该函数依赖 count,就将这个变量保留在内存中,直到返回的函数本身被垃圾回收。
常见误判点
- 只声明内部函数但没返回它 → 不构成闭包
- 返回的是普通值(如数字、字符串)→ 没有函数引用外部变量 → 不是闭包
- 内部函数没引用外部变量 → 即使返回了,也不算真正意义上的闭包
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











