严格模式是一套更严谨的语法和错误检查规则,启用后使静默失败操作抛出错误、禁止不安全写法,并需用"use strict"字面量在脚本顶部或函数首行声明,否则无效。

JavaScript 严格模式不是可选的“增强功能”,而是一套更严谨的语法和错误检查规则——启用后,原本静默失败的操作会抛出错误,不安全的写法会被禁止。它不能解决所有 bug,但能帮你早发现 undefined 变量、重复参数、静默赋值失败等典型隐患。
怎样在脚本或函数中启用严格模式
严格模式必须通过字面量字符串 "use strict" 声明,且必须出现在脚本顶部(全局作用域)或函数体第一行(函数作用域)。任何前置语句(包括注释、空行、console.log)都会导致声明失效。
常见错误写法:
-
"use strict"写在函数中间或条件块里 → 不生效 - 用单引号以外的字符串(如模板字面量
`use strict`)→ 不识别 - 在模块(
.mjs或import场景)中误以为自动启用 → 实际仍需显式声明
正确示例:
立即学习“Java免费学习笔记(深入)”;
function foo() {
"use strict";
x = 1; // ReferenceError: x is not defined
}
严格模式下哪些操作会直接报错
它把很多“容忍型”行为变成明确错误,核心是阻止歧义和潜在危险操作:
- 给未声明变量赋值:
x = 1→ReferenceError - 删除不可配置属性:
delete Object.prototype→TypeError - 使用八进制字面量:
010→SyntaxError(注意:ES2015+ 八进制应写为0o10) - 对象字面量含重复属性名:
{a: 1, a: 2}→SyntaxError - 函数形参重名:
function f(a, a) {}→SyntaxError
这些不是“性能优化”,而是强制暴露代码逻辑缺陷。
严格模式对 this 和 arguments 的影响
非严格模式下,全局函数中 this 指向 window(浏览器)或 global(Node.js),容易掩盖 this 绑定错误;严格模式下,该场景中 this 为 undefined,迫使你明确处理上下文。
同样,arguments 在严格模式下不再与形参同步更新,且无法用 arguments.callee 或 arguments.caller —— 这些都是被废弃的动态调用方式,禁用后更利于引擎优化和静态分析。
示例对比:
function f() { return this; }
f(); // 非严格:window;严格:undefined
严格模式真正的难点不在启用,而在它暴露的是你长期忽略的隐式依赖——比如靠全局泄漏变量、靠 this 默认绑定、靠 arguments 动态访问。一旦启用,别只盯着报错行,要顺藤摸瓜检查变量作用域、函数调用方式和对象定义规范。











