闭包实现轻量级状态监听器,封装私有状态、暴露读写接口并支持回调订阅。核心结构含get/set/subscribe方法,可扩展batch/once等增强功能,需注意内存泄漏防范。

用闭包实现轻量级组件状态监听器,核心是封装私有状态 + 暴露可控的读写接口 + 支持注册回调监听变化。不依赖框架,几行代码就能搞定。
1. 基础结构:闭包封装状态与监听列表
用函数返回对象,把 当前值 和 监听函数数组 闭包在内部,外部无法直接修改,保证状态受控:
function createState(initialValue) {
let value = initialValue;
const listeners = [];
return {
get() { return value; },
set(newValue) {
if (newValue !== value) {
value = newValue;
listeners.forEach(cb => cb(value));
}
},
subscribe(callback) {
listeners.push(callback);
// 返回取消订阅函数(可选但实用)
return () => {
const index = listeners.indexOf(callback);
if (index > -1) listeners.splice(index, 1);
};
}
};
}
2. 使用示例:绑定到 DOM 元素或简单逻辑
比如监听搜索关键词,并实时更新提示文字:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
const searchState = createState('');
// 订阅变化
searchState.subscribe((val) => {
document.getElementById('hint').textContent =
val ? `搜索中:${val}` : '请输入关键词';
});
// 修改状态触发通知
document.getElementById('input').addEventListener('input', e => {
searchState.set(e.target.value);
});
3. 增强点:支持批量更新与一次性监听
避免频繁 set 导致多次触发(如表单多字段同步),可加一个 batch 方法;也支持只监听一次的 once:
- 在
set内部加个isBatching标志,配合flush手动触发 -
once(cb)内部注册后立即返回取消函数,在回调里自动解绑 - 可扩展
getSnapshot()返回当前值+监听数等调试信息
4. 注意事项:避免内存泄漏与误触发
闭包本身不会泄漏,但监听函数若引用了大对象或 DOM 节点,又没及时 unsubscribe,就可能堆积:
- 组件销毁时调用所有
unsubscribe返回的清理函数 - 监听函数尽量写成无副作用的纯函数,或用箭头函数绑定上下文
- 慎用
this或闭包外的大数组/对象,否则 GC 不会回收
不复杂但容易忽略细节。闭包在这里不是炫技,而是天然提供封装边界——状态归它管,谁听、谁改、何时改,全由你定义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










