闭包天然适合构建组件级局部状态,它不依赖外部库、无副作用、作用域隔离明确,特别适合中小型项目或单个功能模块的状态封装。

用闭包封装独立可复用的状态逻辑
把状态变量和操作方法包裹在立即执行函数或工厂函数内,返回一个封闭的接口对象。外部只能通过暴露的方法读写,无法直接访问内部变量。
- 定义一个计数器状态模块:const CounterState = (function () { let count = 0; return { get: () => count, inc: () => ++count, reset: () => count = 0 }; })();
- 每个组件实例可调用 CounterState 获取全新隔离的状态句柄(避免多个组件共享同一份 count)
- 若需多实例,改用工厂函数:const createCounter = () => { let count = 0; return { get() { return count; }, inc() { count++; } }; }; 每次调用都生成新闭包
结合 JSX 或模板渲染实现响应式更新
闭包本身不自动触发重绘,需手动将状态变更与视图更新绑定。常见做法是:在状态方法中回调更新函数,或返回可订阅的观察者接口。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 简单场景:在状态变更后显式调用 render():inc() { count++; render(); }
- 增强模式:支持监听器注册,实现类“发布-订阅”:onUpdate(cb) { listeners.push(cb); } → 触发时遍历执行 cb(this.get());
- 与原生 DOM 结合时,可直接操作 innerHTML 或使用 requestAnimationFrame 节流更新
嵌套闭包实现父子组件通信边界
父组件创建闭包状态,并将部分能力(如只读 getter 或受限 setter)传递给子组件,既保持数据一致性,又防止越权修改。
- 父组件生成状态并透出受控方法:const parentState = createFormState(); const childProps = { value: parentState.getValue, onChange: parentState.updateValue };
- 子组件只拿到函数引用,无法访问或篡改 parentState 内部结构
- 所有变更仍集中于父闭包内,便于日志、校验、防抖等统一处理
搭配模块系统避免污染全局命名空间
ES Module 天然单例 + 闭包私有状态,是最轻量且现代的组合方式。每个 .js 文件就是一个作用域单元。
- 在 formStore.js 中定义:let formData = {}; export const set = (data) => formData = { ...formData, ...data }; export const get = () => ({ ...formData });
- 导入即用,无需 new 或 getInstance,多次 import 对应同一份内存数据
- 配合 tree-shaking,未使用的导出不会被打包,比 Redux 更精简
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










