严格模式是JavaScript中限制性更强的执行上下文,通过"use strict"启用,禁止隐式全局变量、重复参数名等不安全操作,并使错误显式抛出。
严格模式(Strict Mode)是 JavaScript 中一种限制性更强的执行上下文,它让引擎在解析和运行代码时启用更严格的错误检查与行为约束。它不是新语言,而是对现有语法施加额外规则——比如禁止隐式全局变量、静默失败的赋值、重复参数名等。一旦触发,不符合规范的代码会直接抛出 TypeError 或 SyntaxError,而不是悄悄忽略或降级处理。
很多 JS 坏习惯在非严格模式下不会报错,但会导致难以追踪的 bug:
with 语句被完全禁用——它破坏作用域链,影响性能且难以优化NaN = 1)不再静默失败,而是抛出 TypeError
function foo(a, a) {})在严格模式下是语法错误this 在非对象调用时不再指向 window(浏览器)或 global(Node),而是 undefined,避免意外污染全局delete Object.prototype.toString)会立即报错,而非返回 false
严格模式必须通过字面量字符串 "use strict" 显式声明,且只能出现在脚本顶部或函数体开头(不能在条件分支或循环内)。注意:它不支持表达式写法,也不能用变量拼接。
两种开启

"use strict";
function foo() {
"use strict"; // 这里再写一次也合法,但冗余
eval("var x = 1"); // 在严格模式中,eval 不会泄漏变量到外层
return x; // ReferenceError: x is not defined
}
所有现代浏览器和 Node.js 都支持严格模式,但 IE9+ 才开始部分支持,IE8 及更早版本完全忽略该指令(即降级为非严格模式)。所以如果你仍需兼容 IE8,不能依赖严格模式来捕获某些错误。
真正要注意的是:模块(.mjs 文件或 import/export 语法)默认就是严格模式,无需手动声明;而 CommonJS 模块(require)则不自动启用。
建议始终在新项目中启用——不是靠它“修复”代码,而是让它帮你提前暴露松散写法带来的隐患。最稳妥的做法是:每个函数都显式加 "use strict",或者统一在模块顶层声明(尤其使用构建工具时,确保打包后仍保留该指令位置)。