es6模块自动启用严格模式且无法关闭——顶层this为undefined、未声明变量赋值报错、禁止重复参数名、变量不泄漏全局等行为强制生效,无需也不应写"use strict"。

ES6 模块(.js 文件被当作模块加载,或含 import/export 语句,或通过 <script type="module"></script> 引入)**自动启用严格模式,且无法关闭**——你不需要、也不允许写 "use strict",它已内建生效。
模块文件天然就是严格模式环境
只要满足以下任一条件,该 JavaScript 文件就被视为 ES6 模块,顶层作用域立即进入严格模式:
- 文件中出现
import或export语句(哪怕只有一行export {}) - HTML 中用
<script type="module"></script>加载该脚本 - 文件扩展名是
.mjs(Node.js 环境下明确标识为模块)
自动启用带来的关键行为变化
这些不是“可选提醒”,而是模块执行时强制生效的规则:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
顶层
this是undefined,不再是window(浏览器)或globalThis(Node.js) -
未声明变量直接赋值会报错:
count = 1→ReferenceError,而非静默挂到全局 -
重复参数名禁止:
function foo(a, a) { }在模块中直接语法错误 -
变量仅在模块内有效:顶层
let x = 1不会泄漏到全局作用域,也不影响window.x -
禁止
with语句、禁止删除不可配置属性、arguments.callee失效等严格限制全部激活
不需要也不建议手动加 "use strict"
在模块文件顶部写 "use strict" 完全多余,语法合法但无实际作用——模块已强制严格。更要注意的是:
- 它不会报错,但属于冗余代码,可能误导维护者以为“这是普通脚本”
- 如果误把模块当普通脚本运行(比如去掉
type="module"或删掉export),"use strict"才起作用;但此时已失去模块特性(如this变window、变量污染全局)
和传统脚本的关键区别一眼识别
对比就清楚了:
-
普通脚本(
<script></script>或直接运行的 .js):默认非严格,this指向全局对象,未声明赋值自动创建全局变量 -
ES6 模块(无论有没有
"use strict"):强制严格,this === undefined,变量封闭,错误立即暴露










