模块化开发中应优先使用const声明不可重赋值的变量,let仅用于需重赋值的临时状态,禁用var以防作用域污染;const不冻结对象内部属性,跨模块共享引用类型需注意可变性风险。

在模块化开发中,变量声明方式直接影响模块的独立性、可维护性和运行稳定性。核心原则是:每个模块内部统一使用 const 优先、let 按需、禁用 var,并配合模块作用域天然隔离的特性,避免污染和误用。
模块内默认用 const 声明所有常量和引用类型
模块导出的配置、工具函数、数据结构(如数组、对象)只要不重新赋值,一律用 const:
-
✅ 推荐:
const API_BASE = 'https://api.example.com';、const utils = { format() {}, validate() {} }; -
❌ 避免:
var API_BASE = '...';或let utils = {...};(无必要可变时)
即使对象或数组内容可变(如 utils.push() 或 config.timeout = 5000),const 仍适用——它只禁止重新赋值整个变量,不冻结内部属性。
仅在明确需要重赋值时才用 let
模块内部的临时状态、循环计数器、条件分支中的动态值,才启用 let:
-
✅ 合理场景:for 循环索引(
for (let i = 0; i )、累积计算(<code>let total = 0; list.forEach(x => total += x);)、异步回调中的暂存(let result;后续被赋值) -
❌ 不要滥用:把本该一次初始化就固定的配置项写成
let DEBUG = true;,除非你真会在模块运行中切换它
模块顶层不暴露 var,也不依赖全局挂载
CommonJS 或 ES Module 环境下,模块天然拥有独立作用域。var 声明会意外挂载到 module.exports 或全局对象(如 Node.js 的 global、浏览器的 window),破坏封装:
-
✅ 安全做法:所有声明都放在模块最外层作用域,用 const/let,通过
export或module.exports显式导出所需内容 -
❌ 危险行为:
var internalHelper = () => {};—— 它不会自动隐藏,可能被其他模块意外访问或覆盖
注意模块间变量共享的边界
不同模块导入同一对象或数组时,它们指向的是同一个内存地址。若一个模块用 const 声明并导出一个对象,其他模块修改其属性,会影响所有引用者:
- 这是正常行为,不是 bug,但需有意识设计:如配置对象应尽量不可变(可用
Object.freeze()或structuredClone()隔离) - 避免在模块内直接修改从其他模块 import 进来的 const 变量(如
import { config } from './settings.js'; config.mode = 'dev';)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











