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

闭包的核心就是:外部函数返回内部函数,且内部函数访问了外部函数的变量,这些变量因此被“保留”下来,不会随外部函数执行结束而销毁。
闭包的形成条件
必须同时满足三点:
- 有一个外部函数,里面定义了局部变量
- 外部函数内部声明了一个函数(内部函数)
- 这个内部函数引用了外部函数的局部变量,并作为返回值被传出
典型写法:返回带状态的计数器
这是最直观的闭包实例,内部变量 count 被内部函数持续持有:
counter.jsfunction createCounter(initial = 0) {<br> let count = initial;<br> return function() {<br> count++;<br> return count;<br> };<br>}</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill11083" title="Java调试"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20dbae7c507.jpg" alt="Java调试" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill11083" title="Java调试">Java调试</a>
<p>通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。
术语注解
JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议)
remote JVM:远程 Java 虚拟机
step through code:代码单步调试(步入 / 步过 / 步出调试)
inspect variables:变量查看 / 变量检视
stac</p>
</div>
<a href="/xiazai/skill11083" title="Java调试" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/c1c2c2ed740f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Java免费学习笔记(深入)</a>”;</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,就将这个变量保留在内存中,直到返回的函数本身被垃圾回收。
常见误判点
- 只声明内部函数但没返回它 → 不构成闭包
- 返回的是普通值(如数字、字符串)→ 没有函数引用外部变量 → 不是闭包
- 内部函数没引用外部变量 → 即使返回了,也不算真正意义上的闭包

















