模块作用域通过esm或commonjs实现文件级隔离,使顶层声明默认不污染全局;需显式export才可被外部访问,推荐命名导出、冻结配置对象,并慎用globalthis加唯一标识。

模块作用域是现代 JavaScript 防止全局变量污染最有效、最自然的方式。它不是“把全局变量藏起来”,而是从源头上让变量根本进不了全局——每个 .js 文件(启用模块系统后)默认就是一个独立的顶层作用域,里面用 const、let、function 声明的内容,不会自动挂到 window 或 globalThis 上。
用 ES 模块(ESM)替代 script 标签直连
HTML 中改用 <script type="module"></script> 引入脚本,浏览器就会按模块规则执行:
- 文件顶层声明的变量、函数、类,默认仅在该模块内可见
- 不写
export,外部就完全无法访问;哪怕两个模块都声明了const api = {},它们也互不影响 - 不再需要手动加
(function(){...})();或命名空间前缀来“防泄漏”
只导出真正需要共享的接口
模块之间通信靠 export / import,而不是靠往全局塞东西:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 导出尽量精简:比如只
export { init, destroy },不导出内部计数器或缓存对象 - 避免
export default {...}把整个私有状态对象扔出去;更推荐命名导出 + 封装逻辑 - 若需跨模块共享配置,统一导出一个只读对象:
export const CONFIG = Object.freeze({ env: 'prod' });
慎用 globalThis,必须用时加唯一标识
极少数场景(如 polyfill、SDK 入口、与旧代码桥接)确实要扩展全局环境,那就明确控制:
- 不用
window.xxx(Node.js 不兼容),统一用globalThis.MyLib或globalThis.APP_2026 - 用
Symbol作键名可进一步降低冲突概率:globalThis[Symbol.for('my-app-config')] = {...} - 检查是否已存在再赋值,避免覆盖其他库:
if (!globalThis.MyApp) globalThis.MyApp = {...}
CommonJS 模块中同样隔离,但注意 Node.js 环境差异
在 Node.js 里,每个 require() 的文件也拥有独立模块作用域:
-
const helper = () => {}不会泄露到其他文件,即使没写module.exports - 和 ESM 一样,不导出就不可见;但要注意
exports.xxx和module.exports的区别 - Node.js 中没有
window,全局对象是global,但模块内直接声明仍不会自动挂上去
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










