es模块天然隔离顶层作用域,变量默认不污染全局;需用export显式导出,禁用window挂载和隐式全局赋值,iife在模块中多余且有害。

模块导入本身不“保护”作用域,而是每个 ES 模块天然自带独立的顶级作用域。只要用标准 import/export 语法,变量默认就关在模块内部,根本不会跑到全局去——这是语言原生保障,不是靠手动加防护。
ES 模块自动隔离顶层作用域
在 .js 文件中启用模块模式(如通过 <script type="module"></script> 或打包工具识别),该文件的最外层就不再是全局作用域,而是一个私有模块作用域:
-
let、const、function声明的变量和函数,默认不可被外部访问 - 没有
export的内容,其他模块import时完全看不到 - 哪怕两个模块都声明了
const api = 'v1',彼此互不影响
避免意外泄漏:别在模块顶层直接挂 window
即使在模块里,如果写 window.utils = {...} 或 this.myTool = ...,还是等于手动把东西塞进全局。要防止这种“自毁式操作”:
- 删掉所有
window.xxx =、globalThis.xxx =这类显式挂载 - 不要用未声明直接赋值的方式(如
helper = () => {}),这会在非严格模式下悄悄创建全局变量 - 开启严格模式(
"use strict";)可让这类错误直接报错,提前暴露问题
需要跨模块共享?用 export 显式控制出口
想让别的模块用你的功能,不是“放开作用域”,而是明确导出接口:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 命名导出:
export const config = { timeout: 5000 }; - 默认导出:
export default class ApiClient { ... } - 只导出你需要的,不导出中间变量、缓存对象、私有工具函数
- 导出对象时,避免返回可变引用(如直接
export const cache = new Map()),必要时封装成 getter
老代码迁移时注意 IIFE 不替代模块作用域
如果模块里还套着 IIFE,比如:
(function() {<br> const privateData = [];<br> export function doWork() { /* ... */ }<br>})();这种写法是错的——export 必须在模块顶层,不能在函数内。IIFE 在模块里不仅多余,还会干扰静态分析和 tree-shaking。现代项目中,删掉 IIFE,直接靠模块作用域就够了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










