javascript中用闭包保存状态机当前状态的核心是将state变量私有化封装在函数作用域内,仅通过返回的send、getstate等有限方法控制迁移与读取,确保外部无法直接访问或篡改。

JavaScript 中用闭包保存状态机的当前状态,核心是把 状态变量私有化封装在函数作用域内,只通过返回的有限方法(如 send、getState)控制状态迁移和读取,避免外部直接修改。
状态变量藏在闭包里,不暴露给外界
定义一个工厂函数,内部声明 state 变量,所有状态相关逻辑都闭包引用它。外部无法访问或篡改该变量,只能通过返回的对象方法操作:
function createStateMachine(initialState, config) {
let state = initialState; // ✅ 状态被闭包保护
return {
send(event) {
const transition = config[state]?.[event];
if (transition !== undefined) {
state = transition;
}
return this;
},
getState() {
return state;
}
};
}
// 使用示例
const light = createStateMachine('off', {
off: { toggle: 'on' },
on: { toggle: 'off' }
});
light.send('toggle').getState(); // 'on'
light.getState(); // 'on' —— 外部不能直接改 state
支持异步状态迁移时仍保持状态私有
即使状态变更涉及 Promise 或回调,只要 state 在闭包中,就能确保一致性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function createAsyncStateMachine(initialState, asyncConfig) {
let state = initialState;
return {
async send(event) {
const handler = asyncConfig[state]?.[event];
if (typeof handler === 'function') {
await handler(); // 执行副作用,比如 API 调用
// 完成后再更新状态(可选)
state = asyncConfig[state].nextState?.[event] || state;
}
return this;
},
getState() {
return state;
}
};
}
用 class 封装时,也要靠闭包或私有字段隔离状态
如果倾向用 class,可用 #state 私有字段(ES2022+),效果等价于闭包封装;若需兼容旧环境,可在 constructor 中用闭包变量替代:
- 推荐现代写法:
class Machine { #state = 'idle'; ... } - 兼容写法:在 constructor 内定义
let state = initialState,所有方法通过闭包访问 - 避免把
state挂在this.state上——那样就变成可被任意修改的公有属性
关键点:状态迁移逻辑必须可控且不可绕过
闭包只是手段,真正起作用的是 所有状态变更路径都收口在有限几个方法中:
- 不允许外部直接赋值
machine.state = 'xxx' - 状态迁移规则(config)也应只在初始化时传入,运行时不暴露修改入口
- 如有需要,可加 guard 条件或 side effect 回调,但都发生在闭包内
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










