闭包构建的ui配置对象将配置项、校验逻辑与视图联动封装于同一作用域,提供get/set/onchange接口、dom双向绑定、条件约束、异步校验及快照回退能力。

用闭包构建可交互的 UI 配置对象,核心是把配置项、更新逻辑和响应行为封进同一个作用域,让每个配置实例自带状态、校验规则和视图联动能力,不依赖全局变量或外部状态管理。
封装私有配置与受控访问接口
配置对象不应暴露原始数据,而应通过闭包提供安全读写方式。内部用变量保存当前值,对外只暴露 get()、set() 和 onChange() 等方法:
- set() 接收新值,执行合法性校验(如范围检查、格式验证),仅当通过才更新内部状态
- get() 返回当前值,可加缓存或计算逻辑(如单位自动转换)
- onChange(callback) 将回调存入内部数组,set() 触发时批量通知,避免重复绑定
绑定 UI 元素实现双向联动
配置对象创建时接收 DOM 元素(如 input、select 或自定义控件),在闭包内建立双向映射:
- 监听元素 change/input 事件,调用自身的 set() 同步更新配置
- 调用 set() 时,自动同步更新元素 value、checked 或 dataset 属性
- 支持多元素绑定同一配置(如一个字号配置同时控制标题和正文的 font-size)
支持条件约束与动态行为
真实配置常带上下文依赖,比如“启用夜间模式后,字体粗细选项才生效”。闭包可在初始化时捕获依赖项,并在 set() 中动态判断:
- 工厂函数接收 rules 数组,如 { when: () => theme.get() === 'dark', then: (val) => val >= 400 }
- set() 执行前遍历 rules,任一不满足则拒绝更新并返回错误信息
- 也可返回 Promise,在异步校验(如 API 检查用户名是否可用)完成后 resolve 或 reject
提供快照与回退能力
交互中用户可能临时调整又想放弃,闭包可天然保存上一有效状态:
- 每次成功 set() 后,将当前值存为 prevSnapshot
- 暴露 reset() 方法,直接恢复 prevSnapshot,不触发 onChange
- 配合按钮或快捷键,实现“取消本次修改”而非全量重置











