闭包是构建工厂模式下私有状态机最自然、最轻量的机制——它通过函数作用域隔离状态、封装行为,确保实例间互不干扰;工厂函数内定义私有状态与转移逻辑,返回仅暴露transition、send等方法的对象;每次调用生成独立闭包,支持副作用绑定、延迟执行、资源清理及effect订阅响应式联动。

闭包是构建工厂模式下私有状态机最自然、最轻量的机制——它不依赖类或符号私有字段,仅靠函数作用域就能隔离状态、封装行为、保证每个实例互不干扰。
用工厂函数创建独立状态环境
状态机的核心是“状态 + 转移逻辑 + 动作响应”,而闭包恰好能把这三者打包进一个私有作用域:
- 在工厂函数内部定义状态变量(如 currentState、history、pendingTask),外部无法直接读写
- 返回的对象只暴露有限方法:如 transition(to)、send(event)、isIn(state)
- 每次调用工厂函数(如 createStateMachine(config))都生成全新闭包,多个状态机实例彼此完全隔离
封装状态转移与副作用控制
状态变更往往伴随副作用(如 DOM 更新、日志记录、API 调用),闭包让这些逻辑与状态绑定在同一上下文:
- transition() 内部可安全修改私有状态,并同步触发注册的回调(如 onEnter、onExit)
- 可维护一个 handlers = {} 对象,按事件类型映射处理函数,避免 if-else 链
- 支持延迟执行:例如 defer(event) 将事件暂存到队列,由 flush() 统一处理,所有操作都在闭包内完成
支持生命周期管理与资源清理
真实状态机常需监听外部事件(如键盘、WebSocket 消息)、启动定时器,闭包可自带清理能力:
- 在闭包内保存对定时器 ID、事件监听器引用、AbortController 的弱持有
- 提供 destroy() 方法,遍历并清除所有订阅、取消定时器、移除监听器
- 因闭包持有了全部上下文,destroy() 无需传参即可精准释放它创建的一切资源
配合 effect 订阅实现响应式联动
当状态机需要驱动 UI 或与其他模块协同时,可用闭包模拟轻量依赖收集:
- 内部维护 subs = [] 数组,存放监听函数
- 提供 onStateChange(fn) 方法将 fn 加入 subs,并立即执行一次
- transition() 执行后遍历 subs 触发更新,多个视图组件可各自订阅同一状态机,形成松耦合响应式映射










