es modules默认启用严格模式,无需"use strict";顶层this为undefined、禁止隐式创建全局变量、禁止删除不可配置属性、函数参数不可重复、八进制字面量需用0o前缀。

ES Modules(ESM)的模块作用域默认启用严格模式,意思是:**只要一个脚本被当作 ES 模块执行(比如通过 <script type="module"></script> 或 import 加载),它内部所有代码就自动运行在严格模式下,无需手动写 "use strict";。**
严格模式带来的关键行为变化
这些变化不是可选的,而是 ESM 的强制约定:
-
this 值为 undefined:在顶层(非函数内)访问
this,结果是undefined,而不是全局对象(如window或globalThis); -
禁止隐式创建全局变量:比如直接写
a = 10(未用let/const/var声明),会直接报ReferenceError; -
禁止删除不可配置属性:如
delete Object.prototype会抛错; -
函数参数名不能重复:
function fn(a, a) { }在严格模式下语法错误; -
八进制字面量(如
010)被禁用,必须用0o10形式。
模块作用域与严格模式是绑定的
这不是“模块支持严格模式”,而是“模块=严格模式”。你无法在 ESM 中关闭它,也无需开启它:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 写
"use strict";是无效的,会被忽略; - 哪怕整个模块只有一行
console.log(this);,输出也是undefined; - 这个规则适用于模块内所有层级:顶层、函数内、箭头函数内——全部受严格模式约束。
为什么设计成这样?
核心目的是提升代码安全性与可预测性:
- 避免意外挂载到全局,防止变量污染;
- 让错误更早暴露(比如拼错变量名直接报错,而不是静默失败);
- 配合模块的私有作用域(每个模块独立词法环境),共同构成更健壮的封装基础。
对比普通脚本(non-module)
普通 <script></script> 默认是非严格模式:
-
<script>console.log(this);</script>→ 输出window(浏览器中); -
<script>a = 10; console.log(window.a);</script>→ 输出10(变量被挂到全局); -
<script type="module">console.log(this);</script>→ 输出undefined; -
<script type="module">a = 10;</script>→ 报错:ReferenceError: a is not defined。










