严格模式是通过"use strict"字符串启用的执行规则开关,需置于文件或函数首行且格式正确,能使隐式全局变量、重复参数等错误提前暴露。
严格模式不是新语法,而是一行能立刻改变 JavaScript 执行规则的开关——"use strict"。它让原本“悄悄通过”的错误(比如漏写 let 就直接赋值)当场报错,而不是污染全局、掩盖问题、等线上崩了才暴露。
看似简单,但写错位置就等于没开:
.js 文件或 标签内的第一行有效语句,前面只能有注释或空行,不能有 console.log() 或任何表达式if、for 等块中(if (true) { "use strict"; } 无效)"use strict" 必须是字符串字面量——引号、大小写、拼写全要对,'use strict' 也行,但 use strict(没引号)或 "use strict";(分号后换行再写代码)会失效"use strict"; x = 10; // ReferenceError: x is not defined
ES6 模块(import/export)、class、箭头函数这些现代语法默认启用严格模式,但很多场景仍需你亲手加:
.js 脚本(比如老项目里的工具函数、统计埋点脚本)eval("") 或拼接字符串执行逻辑)"use strict" 若不在合并后文件顶部,就失效)this 绑定错误或隐式全局变量这是严格模

undeclared = "oops" → ReferenceError(不再挂到 window 上)function foo(a, a) { } → SyntaxError(参数重复直接不解析)delete Object.prototype → TypeError(不可删属性不再假装成功)with(obj) { } → SyntaxError(直接禁用,避免作用域混乱)foo() 中的 this 从 window 变成 undefined,防止误改全局状态"use strict";
function test() {
console.log(this); // undefined(浏览器中)
}
test();
最容易被忽略的是:严格模式不是“越严越好”,而是“让错误早露脸”。它不改变功能,只改变错误出现的时机和方式。如果你的代码在非严格模式下靠“容错”跑通,那加了 "use strict" 后大概率会立刻报错——这不是模式的问题,是代码本来就有隐患。