闭包实现状态机的核心是封装私有状态与转移逻辑,仅暴露next、getState、reset等接口。通过工厂函数维护state变量,返回方法操作该状态;支持配置化状态图、事件监听及安全校验,防止状态泄露。

用闭包实现状态机,核心是把当前状态和状态转移逻辑封装在函数作用域内,对外只暴露有限的操作接口(如 next、reset 或 getState),避免外部直接修改状态。
基础结构:闭包封装状态与转换规则
定义一个工厂函数,内部维护私有变量 state,返回一组方法。每个方法通过闭包访问并操作该变量,不暴露原始状态值。
例如实现一个三态('idle' → 'running' → 'done')的简单状态机:
function createStateMachine() {
let state = 'idle';
<p>return {
next() {
if (state === 'idle') state = 'running';
else if (state === 'running') state = 'done';
else if (state === 'done') state = 'idle'; // 循环
return state;
},
getState() {
return state;
},
reset() {
state = 'idle';
}
};
}</p><p>const sm = createStateMachine();
console.log(sm.getState()); // 'idle'
sm.next(); // 'running'
sm.next(); // 'done'
sm.next(); // 'idle'
</p>
支持配置化状态与动作
让状态机更通用,可把状态定义、转移条件和副作用(如日志、回调)作为参数传入,闭包仍负责维护运行时状态。
- 用对象定义状态图:
{ from: { to: 'nextState', on: 'event', do: () => {...} } } - 闭包中保存当前状态,并在
send方法里查表执行转移 - 转移前可校验是否允许(防止非法跳转)
带事件监听的闭包状态机
在闭包中维护一个事件监听器列表,每次状态变化时触发回调,增强可扩展性:
- 用数组存
listeners,on('statechange', cb)注册 -
setState(newS)内部更新状态后遍历调用所有监听器 - 监听器接收旧状态、新状态等上下文,便于做响应式处理
注意点:避免意外的状态泄露
闭包保护的是变量引用,不是值拷贝。如果状态是对象或数组,需谨慎处理:
- 不要返回可变状态对象本身(如
return state),应返回只读视图或深拷贝 - 若需导出状态,用
JSON.parse(JSON.stringify(state))或structuredClone(现代环境) - 对输入参数做校验,防止非法状态写入(如
setState('hacked'))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











