javascript闭包通过词法作用域封装私有状态,工厂函数每次调用创建独立隔离的数据容器,返回函数自动绑定所属闭包,适合需长期维持中间值的场景。

JavaScript 中用闭包存储数据,本质是把状态变量定义在函数作用域内,再通过返回的函数“记住”并持续访问这些变量。它不依赖 this、不暴露原始值、也不靠 class 或全局对象,而是靠词法作用域天然形成私有、隔离、持久的数据容器。
工厂函数创建独立状态空间
每次调用工厂函数,都会生成一套全新的变量和方法,彼此完全隔离:
- 比如
createCounter()调用两次,得到两个计数器,各自维护自己的value,互不影响 - 游戏里
createCharacter('orc')和createCharacter('elf')各自拥有独立的hp、position、inventory - 图表库中每个图表实例都持有自己的
scaleFactor、panOffset、lastRenderTime
状态变量全部封装在闭包内部
所有关键数据都在外层函数里声明,外部无法直接读写,只能通过返回的方法间接操作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
let isActive = false, seconds = 0, intervalId = null全部私有 - 外界只能调
start()、pause()、reset(),不能timer.seconds = 100 - 角色背包不能被直接清空:
player.items = []会报错,必须走player.clearInventory()
方法自动绑定所属闭包,无需 this 或 bind
返回的函数在定义时就捕获了当前作用域的变量,调用时自然访问对应那一套数据:
-
increment()总是修改它诞生时那个闭包里的value,跟别的increment毫无关系 - 拖拽事件回调直接读写闭包中的
offsetX和offsetY,不用从 DOM 上反复取 dataset - 即使把方法赋给新变量或传进
setTimeout,它依然记得“自己出生的地方”
适合需要长期维持中间值的场景
闭包让状态稳定驻留内存,特别适合高频更新或跨帧依赖的逻辑:
- 动画循环中持续更新
lastTime和isPaused,供requestAnimationFrame回调反复读取 - 折线图每帧追加点时,复用闭包里缓存的
xScale、yScale,避免重复计算 - Ai 行为树节点的状态(如是否冷却中、上一次决策时间)全靠闭包维持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










