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

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











