严格模式是一组更严格的解析和执行规则,启用后使危险代码直接报错以暴露潜在问题;需用"use strict"字面量在脚本顶部或函数首行声明,禁用静默失败、with语句、重复参数等,并使非函数上下文中this为undefined。
JavaScript 严格模式不是语法糖,也不是新语言,而是一组更严格的解析和执行规则——启用后,原本“能跑但危险”的代码会直接报错,逼你暴露并修复潜在问题。
严格模式必须通过字面量字符串 "use strict" 声明,且必须出现在脚本顶部或函数体第一行(否则无效)。
"use strict";
function foo() {
"use strict"; // 函数级严格模式
// ...
}
"use strict",所有代码受约束if (true) { "use strict"; } 完全无效.mjs 或 import 加载的脚本)默认启用严格模式,无需手动声明它不新增功能,而是封掉容易引发 bug 的旧习,比如静默失败、意外全局变量、模糊的 this 绑定。
ReferenceError(而不是自动挂到 window 上)with 语句被完全禁用——它破坏作用域链,让静态分析失效function f(a, a) {})触发 SyntaxError
010)被禁止,避免歧义;必须写成 0o10
delete 不能用于变量、函数、参数,只能删对象自有属性(否则报 TypeError)this 不再指向全局对象,而是 undefined(防止意外修改全局)this 行为的变化这是最容易踩坑的一点:非严格模式中,独立调用函数时 this 指向全局对象(window 或 globalThis),而严格模式下是 undefi。
ned
"use strict";
function foo() {
console.log(this); // undefined
}
foo(); // 而不是 window
this)call/apply/bind 显式传入的 this 仍正常工作this 绑定更可预测,也更容易发现忘记绑定的事件处理器或回调它不会阻止逻辑错误,也不会帮你防 XSS 或类型错误,但它强制你面对 JavaScript 中那些“靠运气运行”的灰色地带。比如,你写 delete obj.x 却没检查 obj 是否存在,在非严格模式下可能静默失败;而在严格模式下,如果 obj 是 undefined,会立刻抛出 TypeError,让你知道该加空值检查了。
真正容易被忽略的是:严格模式只对**当前作用域**有效,且无法“继承”——子函数不会自动严格,除非自己也写了 "use strict"。混用严格与非严格代码时,边界处的行为差异尤其需要留心。