ESModule默认启用严格模式,无需"use strict";其代码自动受严格约束,如禁止未声明变量、this为undefined、禁用with等,且无法关闭。

ESModule 本身就在严格模式下运行,无需手动启用 "use strict",所有模块代码自动受严格模式约束。
模块脚本天然处于严格模式
根据 ECMAScript 规范,任何以 import 或 export 声明的 JavaScript 文件(即 ES 模块)都会被引擎强制视为严格模式代码。即使没有显式写 "use strict",以下行为也生效:
- 禁止使用未声明变量(如直接赋值
x = 1会报ReferenceError) - 函数参数名不能重复(
function foo(a, a) { }报SyntaxError) -
this在普通函数调用中为undefined(非全局对象) - 禁止删除不可配置属性(
delete obj.prop失败并抛错) - 八进制字面量(如
010)和with语句被禁用
与传统 script 标签的区别
通过 <script src="..."></script> 加载的普通脚本默认是非严格模式(除非显式加 "use strict"),而模块脚本(<script type="module" src="..."></script> 或动态 import())始终是严格模式:
-
type="module"脚本:自动严格,且具有顶层作用域、异步加载、CORS 限制等特性 -
import的模块:无论来源(本地、CDN、data URL),只要被当作模块解析,就启用严格模式 - 注意:CommonJS(Node.js 的
require)或 AMD 模块不自动启用严格模式,需手动加"use strict"
不能关闭严格模式
在 ESModule 中无法退出严格模式:
立即学习“Java免费学习笔记(深入)”;
- 模块顶层不允许使用
"use strict"的反向指令(根本不存在“非严格”开关) - 模块内嵌套的函数或 eval 不会改变该约束;
eval("x = 1")在模块中仍会报错 - 试图用
arguments.callee、caller等严格模式禁用特性,一律抛TypeError
实际开发中的影响
开发者需注意这些隐含约束带来的常见问题:
- 全局变量声明必须用
var、let、const,不能省略关键字 - 避免在模块顶层使用
arguments对象的某些属性(如callee) - 解构赋值时,右侧不能为
null或undefined(否则立即报TypeError) - 模块间共享状态应通过
export/import显式管理,而非依赖隐式全局


















