严格模式是一组更严格的解析和执行规则,启用后使危险代码直接报错以暴露潜在问题;需用"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),而严格模式下是 undefined。
立即学习“Java免费学习笔记(深入)”;
"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"。混用严格与非严格代码时,边界处的行为差异尤其需要留心。











