ES Module 默认启用严格模式且作用域独立。模块顶层 this 为 undefined,禁止静默失败,变量不挂载全局对象,跨模块需显式 export/import;export 创建只读绑定,import 为实时引用;CORS 加载与 defer 特性进一步隔离执行环境。

ES Module 的作用域独立性和严格模式是绑定生效的,不需要手动开启或额外配置,只要符合 ESM 规范,这两点就自动成立。
模块天然运行在严格模式下
所有 <script type="module"> 脚本,以及通过 import 加载的 .js 文件(无论是否带 .mjs 后缀),都会自动启用严格模式。你写不写 "use strict" 都没影响,它被忽略,且无法关闭。
-
this在顶层模块中为undefined(非模块脚本中是window或globalThis) - 禁止静默失败的操作,比如给只读属性赋值、删除不可配置属性,会直接抛
TypeError - 函数参数名不能重复,八进制字面量(如
010)非法
每个模块拥有私有顶层作用域
ESM 不会把变量挂到全局对象上,也不共享顶层声明。即使两个 <script type="module"> 标签写在同一 HTML 里,它们的顶层变量也完全隔离。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 在模块 A 中声明
const count = 1,模块 B 里访问count会报ReferenceError - 这种隔离不是靠闭包模拟的,而是语言级机制:每个模块对应一个独立的词法环境(Lexical Environment)
- 想跨模块共享,必须显式
export并在另一端import,没有例外
导出与导入强化作用域边界
ESM 的 export 不是“暴露变量”,而是建立一个只读的绑定引用;import 得到的也不是副本,而是对原始值的实时连接。
立即学习“Java免费学习笔记(深入)”;
- 导出的变量在源模块中被修改,所有导入方看到的值同步更新
- 导入方不能重新赋值给命名导入的标识符(
import { x } from './a.js'; x = 2报错) - 默认导出(
export default)和命名导出(export const x = 1)都遵循同一套作用域与绑定规则
CORS 和 defer 行为进一步隔离执行环境
ESM 脚本通过 CORS 加载外部模块,且默认具有 defer 特性——这意味着:
- 模块脚本不会阻塞 HTML 解析,也不会污染初始渲染时的全局执行上下文
- 跨域模块加载失败(如缺少
Access-Control-Allow-Origin)会直接中断模块图构建,不会退化为普通脚本 - 多个模块按依赖顺序依次求值,但彼此的顶层作用域始终不交叉

















