ES Modules每个文件默认拥有独立顶层作用域,变量函数不导出即私有;import创建只读绑定而非全局引用;模块自动启用严格模式,禁止隐式全局变量。

ES Modules(ESM)的模块作用域不是“额外加上的保护”,而是语言层面默认的行为——每个 .js 文件(被当作模块加载时)自动获得一个独立的顶层作用域,变量、函数、类只要不显式导出,就天然不可见、不可访问。
模块文件即独立作用域单元
浏览器中用 <script type="module"></script> 或 Node.js 中以 .mjs 后缀运行的文件,其顶层代码不再属于全局作用域。这意味着:
-
const API_URL = 'https://api.example.com';只在当前文件内有效,不会变成window.API_URL -
function validate() { }不会挂载到全局对象,其他模块也看不到这个函数名 - 即使两个模块都写
let count = 0;,它们互不影响,各自维护自己的count
声明即私有,导出才可见
模块不默认共享任何东西。所有顶层声明默认“锁”在本模块内,必须通过 export 主动暴露:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 命名导出:
export const MAX_RETRY = 3;、export function log() { } - 默认导出:
export default class Store { }(每模块仅一个) - 重命名导出:
export { helper as utilsHelper };,避免外部命名冲突 - 聚合导出:
export * from './types.js';,集中转发但不污染当前作用域
导入不等于全局引用,而是作用域绑定
import 不是把变量“搬到全局”,而是在当前模块作用域内创建一个只读绑定:
立即学习“Java免费学习笔记(深入)”;
-
import { STATUS_OK } from './status.js';→ 这个STATUS_OK只存在于本文件作用域 - 删掉这行
import,该变量就彻底不可用,打包工具也能据此剔除未使用代码(tree-shaking) - 多个模块同时导入同一个值,拿到的是各自作用域内的独立绑定,彼此修改不干扰
严格模式默认启用,杜绝隐式全局
模块脚本自动处于严格模式,无需写 "use strict":
- 直接给未声明变量赋值(如
foo = 123)会立即报错,而不是悄悄挂到全局 - 重复声明(
let x; let x;)、参数重名等语法错误提前暴露,从源头防止意外污染

















