JavaScript闭包是函数与其词法作用域中被捕获的外部变量组成的组合,形成于内部函数引用外部变量且在外部函数返回后仍存在时,用于封装私有变量、解决循环绑定问题、实现函数工厂与柯里化等。

JavaScript闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数在其原始作用域之外执行。简单说,就是“函数 + 它被捕获的外部变量”组成的组合。
闭包是怎么形成的?
当一个内部函数引用了外部函数的变量,并且这个内部函数在外部函数返回后仍然存在(比如被返回、赋值给变量或作为回调),闭包就产生了。
- 外部函数执行完,本该销毁的局部变量没被回收,因为内部函数还在“用着”
- 每个闭包都维持自己的一份外部变量副本,互不干扰
- 常见写法是 return 一个函数,或把函数作为参数传出去
封装私有变量和方法
闭包可以模拟“私有成员”,避免全局污染,也防止外部直接修改关键数据。
- 比如计数器:外部只能调用 increment() 或 getValue(),不能直接改 count
- 模块模式早期就靠闭包实现单例、私有状态和公共接口
- 现代 class 的 # 私有字段出现前,闭包是主要手段
事件处理与异步回调中的变量绑定
循环中为多个元素绑定事件时,容易因变量提升或共享引用导致所有回调用同一个值——闭包能解决这个问题。
1、什么是店中店?店中店是全诚商多用户版的一大特色,它既是独立的个体,又具有群集功能。我们做个例子说明:假设尊贵的您现实生活中租赁了一个店面,店面空间很大,您可以把您的店面分割成很多独立空间再向别人转租,这样您可以额外获得一部分租赁费用收入,借以减少你的个人租赁费用投入,还能起到活跃销售场所的气氛,俗话说:货卖一堆吗。你租赁的店面可以完全分割成很多空间向外转租,也可以自己保留一块空间为自己销售商品
立即学习“Java免费学习笔记(深入)”;
- for 循环里用 let 声明 i,本质是每次迭代创建新绑定(背后是块级作用域+闭包)
- 手动写 IIFE(立即执行函数)传入当前 i,也是利用闭包固化值
- setTimeout、fetch 回调里要保留发起时的状态,常靠闭包捕获 id、token 等上下文
函数工厂与柯里化
闭包让“生成函数”变得自然:根据输入预设部分参数,返回定制化的新函数。
- 比如 createMultiplier(2) 返回一个乘以 2 的函数,createMultiplier(10) 返回乘以 10 的函数
- 日志函数可带固定前缀:const debugLog = makeLogger('[DEBUG]'),后续调用都自动加前缀
- 柯里化(如 add(1)(2)(3))每一步都靠闭包记住前面的参数
基本上就这些。闭包不是黑魔法,它只是 JavaScript 作用域规则的自然结果——理解了词法作用域,闭包就水到渠成。用得多但写得少,多数时候它藏在工具函数、React Hook、模块打包器甚至浏览器 API 里默默工作。










