闭包是函数与其创建时的词法环境共同组成的运行时状态。需满足三条件:函数嵌套、内层函数引用外层变量、内层函数脱离外层作用域执行;引擎因此保留外层变量不被回收。

闭包就是“带背包的函数”
想象你写了一个函数,它出生在某个作用域里(比如另一个函数内部),这个“出生地”的变量它都记在心里。哪怕它后来被返回、被传到别处执行,依然能打开自己的“小背包”,拿出当初出生时环境里的变量来用——这个函数加上它背的那套环境,合起来就是闭包。
形成闭包的三个硬性条件
少一个都不算真正闭包:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 函数嵌套:必须有内层函数定义在外层函数内部(可以是命名函数、匿名函数或箭头函数)
- 引用外部变量:内层函数实际用到了外层函数的局部变量、参数或函数声明(不是光定义,得真访问)
- 脱离词法环境执行:内层函数被返回、赋值给变量、作为参数传出去,最终在**外层函数作用域之外**被调用
核心组成:函数 + 词法环境
闭包不是语法结构,而是一种运行时状态组合:
- 函数本身:通常是那个被返回或外传的内层函数
- 词法环境(Lexical Environment):它创建时所处的作用域快照,包括外层函数的变量对象、作用域链引用
- 这两者被 JavaScript 引擎绑定在一起,只要该函数还存在,引擎就不会回收它所依赖的外层变量——哪怕外层函数早已执行完毕
为什么变量没被清掉?关键在垃圾回收机制
正常情况下,函数执行完,它的局部变量立刻进垃圾回收队列。但一旦有闭包存在,JS 引擎发现:“这个变量还在被某个活函数用着”,就会把它保留在内存中。这不是泄漏,是按需保留——直到那个闭包函数本身也被销毁(比如变量被重新赋值、离开作用域)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










