核心是变量应限于必要上下文,通过模块作用域、闭包或私有字段控制访问;按业务语义分组(如authstore.js),避免全局污染与大杂烩式常量文件。

核心是让变量只在真正需要它的上下文中存在,不暴露、不污染、不被误用。关键不在“怎么声明”,而在“谁该访问它”和“怎么控制访问路径”。
用模块作用域天然隔离变量
ES6 模块默认就是私有作用域。导出的只是接口,内部变量默认不可见:
- 把一组强相关的变量(如配置项、缓存对象、状态标记)定义在同一个
.js文件里,不加export - 只通过命名导出函数或类来提供操作能力,而非直接导出原始变量
- 避免使用
var或挂到全局(window.xxx),也别用export const xxx = ...暴露可变状态
用闭包封装可变状态与行为
当需要维护内部状态(比如计数器、请求锁、缓存 Map),闭包比类更轻量且天然私有:
- 写一个工厂函数,返回带方法的对象;内部变量在函数作用域中,外部无法直接读写
- 例如:
const createCounter = () => { let count = 0; return { inc: () => ++count, get: () => count }; }; - 所有逻辑围绕同一组变量组织,内聚性高;调用方只依赖返回的接口,耦合度低
用 Class + 私有字段明确职责边界
适合有明确实体概念、需复用多实例的场景(如 API 客户端、表单管理器):
- 用
#privateField语法确保变量不可被外部访问或篡改 - 每个方法只操作本类关心的数据,不越界读写其他模块的状态
- 对外只暴露必要方法(如
submit()、reset()),隐藏实现细节(如请求队列、错误重试逻辑)
按业务语义分组,拒绝“Utils”式大杂烩
变量不是按类型(string / number)分组,而是按“谁在用、为什么用”来组织:
- 把用户会话相关变量(token、expiresAt、userInfo)全放在
authStore.js里 - 把表格分页参数(page、size、sort)和加载状态(loading、error)一起放在
tableState.js - 删除
constants.js里混着 API 地址、枚举、文案的“万能常量文件”,拆成apiEndpoints.js、userStatus.js等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











