严格模式是JavaScript中更严格的执行规则,通过"use strict"启用,全局或函数级生效,ES模块默认启用,它使未声明赋值、重复参数等错误显式报错,提升代码健壮性。

JavaScript 严格模式不是新语法,而是一套更“较真”的执行规则——它让原本会静默失败或产生意外行为的代码,直接报错,帮你提前发现问题。
如何启用严格模式:两种方式,作用范围完全不同
启用只需一行字符串字面量 "use strict",但它必须出现在“可执行语句之前”,否则无效:
- 全局启用:放在整个 JS 文件或
标签的最顶部(前面只能有注释) - 函数级启用:放在某个函数体的第一行(不能在
if、for等块内写) - ES 模块(含
import/export的文件)默认就是严格模式,无需手动加 -
"use strict"必须是双引号包裹的字符串字面量;单引号虽在部分环境能用,但不符合规范,不推荐
"use strict";
function foo() {
"use strict"; // ✅ 有效:函数级启用
bar = 42; // ❌ 报 ReferenceError
}
if (true) {
"use strict"; // ❌ 无效:不在函数体开头,也不在脚本顶层
}
为什么启用后代码突然报错?常见触发场景
很多旧代码在非严格模式下“凑合能跑”,一开严格模式就崩,往往是因为踩中了这几类限制:
-
name = "Alice":未声明就赋值 →ReferenceError(强制要求用let/const/var) -
function test(a, a) { }:重复参数名 →SyntaxError -
delete window.location或delete myVar:删除变量/不可配置属性 →TypeError -
with(obj) { ... }:使用with语句 → 直接语法错误 - 独立调用函数时
this是undefined而非window,可能影响事件回调或call/apply逻辑
容易被忽略的关键细节
严格模式不是“开关式”功能,它的生效边界很具体,稍不注意就白加:
立即学习“Java免费学习笔记(深入)”;
- 箭头函数不支持单独启用严格模式,它继承外层作用域的严格状态
- 模块中即使没写
"use strict",也默认启用——所以现代项目里你很可能已经在用了,只是没察觉 - 不能靠条件判断动态开启:
if (DEBUG) { "use strict"; }完全无效 - 旧项目迁移时,建议从新函数或新模块开始逐步启用,避免一次性爆大量
ReferenceError
真正要注意的,不是“要不要开”,而是理解哪些行为在严格模式下会被拦截——因为这些拦截点,往往就是你代码里最脆弱、最容易被忽略的角落。











