严格模式是JavaScript中限制性更强的执行上下文,通过"use strict"启用,禁止隐式全局变量、重复参数名等不安全操作,并使错误显式抛出。

严格模式是什么:一段被“加锁”的 JavaScript 代码
严格模式(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" 显式声明,且只能出现在脚本顶部或函数体开头(不能在条件分支或循环内)。注意:它不支持表达式写法,也不能用变量拼接。
两种开启方式的区别很关键:
立即学习“Java免费学习笔记(深入)”;
- 脚本级严格模式:整个 JS 文件生效,需放在文件第一行(前面不能有任何语句,包括注释)
- 函数级严格模式:只对当前函数及其内部嵌套函数生效,不影响外部作用域
"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",或者统一在模块顶层声明(尤其使用构建工具时,确保打包后仍保留该指令位置)。











