严格模式是通过"use strict"启用的运行时约束开关,会将静默失败转为报错;必须置于脚本顶部或函数首行,拦截with、只读属性赋值、重复参数等危险操作,并限制eval和arguments行为;ES6模块等现代环境默认启用,CommonJS仍需手动声明。

JavaScript 严格模式不是“新语法”,而是对运行时行为的约束开关——启用后,原本静默失败或怪异的行为会直接报错,帮你提前暴露问题。
如何在代码中启用严格模式
严格模式必须通过字面量字符串 "use strict" 声明,且必须出现在脚本顶部或函数体第一行(前面不能有其他语句,包括注释也不行):
"use strict";
function foo() {
"use strict"; // 函数级启用,只影响该函数内
delete x; // 报错:Cannot delete unqualified identifier
}
常见错误写法:
- 放在
if或for里 —— 不生效 - 前面有空行或注释 —— 全局模式失效(函数内仍可能生效)
- 用
'use strict'单引号 —— 合法但不推荐,保持统一即可
严格模式下哪些操作会报错而非静默忽略
它主要拦截三类“危险默认”:
立即学习“Java免费学习笔记(深入)”;
-
with语句被完全禁止(with会导致作用域链不可预测) - 给只读属性赋值(如
NaN = 1、undefined = 2)抛出TypeError - 删除不可配置属性(
delete Object.prototype)报错,而非返回false - 函数参数名重复(
function f(a, a) {})在严格模式下是语法错误 -
this在非对象调用中不再自动绑定到全局对象(foo()中this是undefined,而不是window或global)
严格模式对 eval 和 arguments 的限制
这两个机制在非严格模式下有大量隐式行为,严格模式大幅收紧:
-
eval不再能声明变量或函数(eval("var x = 1")不会污染外层作用域) -
arguments不再与形参自动同步(修改arguments[0]不再影响对应参数变量) -
arguments.callee和arguments.caller被禁用(它们阻碍优化且易引发混淆)
这意味着依赖 arguments.callee 实现递归的旧代码,在严格模式下会直接报 ReferenceError。
现代开发中是否还需要手动加 "use strict"
基本不需要了。ES6 模块(.mjs 或 import/export 文件)默认启用严格模式;Babel、TypeScript 等工具输出也默认包含;Node.js 的 ES 模块环境同样强制严格。
唯一还需留意的是:CommonJS 模块(require() 加载的 .js)仍默认非严格,如果你写的是纯 CJS 工具脚本、或需要兼容老 Node 版本,仍建议显式声明。
真正容易被忽略的点是:严格模式的边界由声明位置决定,不是文件级或项目级开关——混用严格与非严格代码时,函数内部是否报错,只取决于它自己有没有那行 "use strict"。











