闭包必须满足三个条件:外部函数为表达式且内部嵌套函数,内部函数引用外部函数的局部变量,外部函数返回内部函数本身而非调用结果;如 makeAdder(5) 返回的函数持续引用 base,使其在执行后仍保留在内存中。

直接用函数表达式实现闭包,关键在于“定义即封装”:把变量和逻辑包进一个函数里,再返回一个能访问这些变量的内部函数。它不依赖 class 或 this,靠的是作用域链天然保留外部变量的能力。
必须满足三个结构条件
缺一不可,否则不是真正闭包:
- 函数表达式内部要定义另一个函数(嵌套)
- 内部函数要读取或修改外部函数表达式的局部变量(不能是全局变量)
- 外部函数表达式必须返回内部函数本身(不是调用结果,不加括号)
JavaScript 中最简实践写法
用箭头函数或 function 表达式都行,重点是立即形成独立作用域:
const makeAdder = (base) => {
return (num) => base + num; // 内部函数记住 base
};
const add5 = makeAdder(5);
console.log(add5(3)); // 8这里 base 是自由变量,makeAdder 执行完后本该销毁,但被返回的函数持续引用,因此保留在内存中。
Python 中对应实现方式
原理一致,只是语法略有不同:
def make_multiplier(factor):
def multiply(x):
return x * factor # 访问外层 factor
return multiply
<p>double = make_multiplier(2)
print(double(7)) # 14调用 make_multiplier(2) 后,factor=2 被绑定进闭包,后续每次调用 double 都复用这个值。
常见误操作提醒
容易以为只要嵌套就有闭包,其实以下情况都不构成有效闭包:
- 外部函数返回的是
inner()(带括号)→ 返回的是执行结果,不是函数 - 内部函数没引用外部变量 → 只是普通嵌套,无状态记忆能力
- 变量来自全局作用域 → 不是“捕获”,只是常规查找
- 用 var 声明且存在变量提升干扰 → 推荐统一用 const/let(JS)或直接赋值(Py)

















