javascript函数式状态机以纯函数替代可变状态,状态即函数、转移即调用;通过闭包携带只读上下文,组合管道化处理流程,并将副作用隔离至外部触发。

JavaScript 函数式编程风格下的状态流转,核心是用纯函数代替可变状态,靠函数返回值驱动状态变化,而不是修改某个 state 变量。它不依赖 this、实例属性或全局变量,所有“状态”都显式地作为参数传入、作为新值返回。
状态即函数,转移即调用
每个状态被定义为一个接收上下文(如事件、数据)并返回下一个状态函数的纯函数。整个流程靠递归或链式调用维持:
-
offState(event):若 event 是
'push',返回onState;否则返回自身 -
onState(event):若 event 是
'push',返回offState;否则返回自身 - 初始调用从
offState开始,后续每次触发都用上一次返回的函数继续处理
闭包封装上下文,避免共享状态
当需要携带业务数据(如订单号、用户权限),可用闭包捕获,但不修改它:
- 工厂函数
createOrderMachine(orderId, status)返回初始状态函数 - 各状态函数内部通过闭包访问
orderId,执行逻辑时只读,不写入 - 状态切换时,新函数仍基于原始数据构建,旧状态不可被篡改
组合与管道化增强表达力
多个状态行为可借助高阶函数组合,形成清晰的数据流:
- 用
pipe(onValidate, onPersist, onNotify)把校验、保存、通知等纯函数串成一条链 - 每个环节只关心输入输出,不持有中间状态
- 错误分支也可统一用
Either或自定义结果类型(如{ ok: true, next: onConfirmed })来表达,保持无副作用
与真实场景对接的关键细节
实际开发中,需注意三类衔接点:
- 事件入口:DOM 事件、定时器回调、API 响应等,统一转为标准化事件对象再送入状态函数
-
副作用隔离:UI 更新、日志、请求等必须抽离到状态函数外部,由返回值触发(例如返回
{ type: 'UPDATE_UI', payload: ... }) - 调试友好性:每个状态函数可独立单元测试;加一层薄包装(如记录输入/输出日志)不影响逻辑纯净性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











