闭包是函数与其定义时词法环境绑定形成的运行时结构。它由函数体和指向外层作用域的隐藏引用组成,因内部函数引用外部变量且被返回或传出,使变量因活跃引用而延续生命周期。

闭包的本质,是函数与其定义时的词法环境绑定在一起形成的“记忆体”。不是函数主动“记住”,而是语言引擎在函数创建时,自动为其保留了对当时作用域中变量的引用。
词法作用域决定变量可见性
函数在写成那一刻,JavaScript 或 Python 就已确定它能访问哪些变量——依据代码书写的位置(而非调用位置)。这个静态确定的作用域关系,就是词法作用域。内部函数只要引用了外部函数的局部变量,引擎就会把该变量纳入其“闭包环境”。
函数是一等公民,携带环境一起走
当内部函数被返回或传出去时,它不是一个孤立的代码块,而是一个包含两部分的对象:
- 可执行的逻辑(函数体)
- 一个隐藏的引用,指向它诞生时的外层作用域(含变量值或地址)
这个组合体,就是闭包。所以不是“函数记得”,而是“函数天生就带着它的出生证明和行李”。
变量不销毁,只因仍有活跃引用
通常,函数执行完,其局部变量会被垃圾回收。但若这些变量被闭包中的函数持续引用,引擎就不能释放它们——因为还有活的路径可以访问到它们。这种引用关系维持了变量的生命周期,让“状态”得以延续。
闭包不是语法糖,是运行时结构
它没有特殊关键字,也不靠修饰符声明;只要满足三个条件,闭包就自然产生:
- 存在函数嵌套
- 内层函数引用了外层函数的局部变量(非参数、非自身声明)
- 外层函数返回了内层函数(或以其他方式使内层函数在外部可调用)
此时,内层函数就不再只是一个函数,而是一个携带着“过去环境”的实体。

















