严格模式是JavaScript的限制性变体,通过"use strict"启用,增强错误检查、禁用不安全语法、修正this绑定,并在ES6模块和class中默认启用。
严格模式不是一种新语言,而是 JavaScript 的一种限制性变体,它让引擎对代码执行更严格的检查。启用后,原本静默失败的操作(比

TypeError 或 ReferenceError;一些不安全或易混淆的语法(如 with 语句、八进制字面量 010)会被禁止;同时,this 在非对象上下文中的值不再是全局对象,而是 undefined。
必须通过字面量字符串 "use strict" 声明,且它必须是作用域内**最前面的可执行语句**(注释或空行可以出现在它之前,但不能有其他 JS 语句)。
"use strict" 放在文件顶部第一行(或模块顶层)"use strict" 放在函数体第一行(包括箭头函数不可用,因无函数体)if 块或循环中动态开启"use strict";
function foo() {
"use strict"; // ✅ 函数级启用
eval("var x = 1"); // ❌ 严格模式下 eval 不创建变量到外层
undeclared = 42; // ❌ ReferenceError: undeclared is not defined
}
很多看似“能跑通”的旧写法,在严格模式下会立刻暴露问题:
delete 操作符不能删除不可配置属性,否则抛 TypeError
function f(a, a) {})直接语法错误arguments.callee 和 arguments.caller 被禁用,访问即报 TypeError
{a: 1, a: 2})在严格模式下是语法错误(某些老引擎可能忽略)eval 和 arguments 不能作为变量名或函数参数名ES6 模块(.mjs 文件或 )和类(class)内部默认启用严格模式,无需显式声明。但普通 标签加载的脚本、CommonJS 模块(Node.js 中的 .js)、以及 IIFE 包裹的代码仍需手动添加 —— 尤其当你不确定运行环境是否已默认启用时。
容易被忽略的一点是:如果一个函数在严格模式下定义,它的嵌套函数即使没写 "use strict",也自动继承严格模式;但反过来不成立 —— 非严格函数里的子函数不会自动变严格。