es6模块天然具备独立作用域,每个模块文件自动拥有私有作用域,let/const/function/class等声明仅在本模块有效,不污染全局;需显式export才能被其他模块import访问,未导出变量完全不可见。

JavaScript 模块(ES6 Modules)天然具备独立作用域,模块内声明的变量默认不会泄露到全局或其他模块中——这是模块化设计的核心特性之一,不需要额外封装。
模块作用域是默认隔离的
每个 .js 文件作为 ES6 模块加载时(通过 type="module" 或 import/export 语法),都会自动获得一个私有作用域。在这个作用域里:
-
let、const、function、class等声明都仅在本模块内有效 - 即使不写任何闭包或 IIFE,也不会污染全局命名空间
- 同名变量在不同模块中可安全共存,互不影响
导出与导入控制可见性
模块内部的变量默认“隐身”,只有显式 export 才能被其他模块访问:
- 用
export const foo = 1;或export { foo };暴露指定变量 - 用
import { foo } from './module.js';在其他模块中按需引入 - 未导出的变量(如
const internal = 'secret';)外部完全不可见
和 IIFE 的区别要清楚
在旧项目或非模块环境中,开发者常用 IIFE 实现类似隔离效果;但在现代模块系统中:
- IIFE 是手动模拟模块作用域的临时方案,已非必需
- 模块作用域由引擎原生支持,更可靠、更易读、支持静态分析和 tree-shaking
- 混用 IIFE + 模块无实际收益,反而增加冗余
注意:脚本模式 vs 模块模式
模块作用域只在模块上下文中生效。若文件未被识别为模块(比如直接用 <script src="a.js"></script> 且无 type="module"),它仍运行在全局作用域中:
- 添加
type="module":<script type="module" src="main.js"></script> - 或确保入口文件至少含一个
export或import语句(多数打包工具会据此判定模块类型)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











