JavaScript闭包是函数与其词法作用域中变量的组合,可封装私有变量、解决循环绑定问题、实现函数工厂与柯里化、以及缓存计算结果。

JavaScript 闭包是指一个函数能够访问并记住它定义时所在词法作用域中的变量,即使这个函数在其他作用域中被调用。简单说,闭包 = 函数 + 它能访问的外部变量环境。关键点在于:外部函数执行完后,其局部变量没有被销毁,而是被内部函数“捕获”并持续持有。
封装私有变量和方法
JavaScript 原生不支持真正的私有属性,但闭包可以模拟。把变量声明在函数内部,只通过返回的对象方法暴露有限接口,外部无法直接读写该变量。
- 避免全局污染,防止命名冲突
- 实现数据校验或访问控制(比如只允许 increment,不允许直接赋值)
- 常见于计数器、配置管理器、单例状态模块
例如:const createCounter = () => { let count = 0; return { inc: () => ++count, get: () => count }; }; 外部调用 counter.inc() 会更新内部 count,但无法绕过方法直接修改。
循环中绑定事件或异步操作
在 for 循环里给多个元素绑定点击事件,或用 setTimeout 延迟执行时,若直接引用循环变量,容易所有回调都输出同一个最终值(如全部是 5)。闭包可为每次迭代“快照”当前变量值。
1、什么是店中店?店中店是全诚商多用户版的一大特色,它既是独立的个体,又具有群集功能。我们做个例子说明:假设尊贵的您现实生活中租赁了一个店面,店面空间很大,您可以把您的店面分割成很多独立空间再向别人转租,这样您可以额外获得一部分租赁费用收入,借以减少你的个人租赁费用投入,还能起到活跃销售场所的气氛,俗话说:货卖一堆吗。你租赁的店面可以完全分割成很多空间向外转租,也可以自己保留一块空间为自己销售商品
立即学习“Java免费学习笔记(深入)”;
- 用立即执行函数包裹((i => ...)(i))
- ES6 可改用 let 声明循环变量(块级作用域天然解决)
- 本质是让每个回调函数拥有自己独立的外部变量引用
函数工厂与柯里化
闭包适合生成一批行为相似但参数预设不同的函数。比如固定某个参数,返回新函数;或分步接收参数。
- const add5 = (x) => x + 5; 是静态写法;而 const add = a => b => a + b; 利用闭包动态生成 add(5) 这样的函数
- 可用于创建带默认配置的 API 调用函数、不同精度的格式化器、主题化的 UI 工具等
缓存计算结果(记忆化)
对耗时或重复调用的函数(如递归斐波那契、复杂字符串处理),可用闭包维护一个内部缓存对象,首次计算后存结果,后续相同输入直接返回。
- 减少重复开销,提升性能
- 缓存生命周期与闭包函数绑定,天然隔离,不污染全局
- 注意内存占用,必要时增加清理机制(如 LRU 策略)










