es模块自动启用严格模式,是规范强制的解析时约束,非运行时行为;禁止隐式全局、参数重名、with语句等,所有type="module"脚本无论内容如何均适用。

因为 ES 模块(ESM)规范从设计之初就将严格模式作为语言级强制要求,不是可选项,也不依赖开发者手动声明。
这是规范强制的底层契约
所有以 type="module" 加载的脚本,无论是否含 import 或 export,都会在解析阶段就被引擎按严格模式规则校验。它不是运行时行为,而是词法分析和语法分析时的硬性约束——一旦发现非法语法(比如重复参数名、with 语句、隐式全局赋值),直接抛 SyntaxError 或 ReferenceError,根本不会进入执行阶段。
自动启用带来几项关键保障
-
禁止隐式创建全局变量:如
foo = 123会立即报错,而不是挂到window上 -
函数参数不能重名:
function bar(a, a) {}在解析时就失败 -
this在独立调用中为undefined,避免非预期的全局绑定 -
禁用
with和arguments.callee,消除歧义和性能隐患 - 对只读属性赋值或删除不可配置属性,直接抛
TypeError
与传统脚本有本质区别
普通 <script></script> 默认是非严格模式,必须显式写 "use strict" 才生效,且位置必须严格(脚本顶部或函数第一行)。而模块脚本完全绕过这一步——构建工具(如 Vite、Rollup)、浏览器、Node.js 都统一遵循该规则,连动态 import() 返回的模块也继承这一特性。
不靠约定,靠机制
这不是“推荐做法”,而是解析器的行为标准。你删掉所有 export、清空 import、甚至只写一行 console.log(1),只要加了 type="module",它就是严格模式。这种一致性让代码更可预测,也让错误暴露得更早、更明确。











