严格模式是限制性更强的执行环境,禁用with语句、未声明变量赋值、arguments.callee、重复参数、非对象调用时this指向全局等宽松行为,启用需顶部字符串字面量,模块默认启用。

JavaScript 严格模式("use strict")不是新语法,而是一组限制性更强的执行环境——它让引擎对代码做更严格的语法和行为检查,直接暴露原本被静默忽略的问题。
为什么加 "use strict" 后代码突然报错?
因为严格模式禁用了大量“历史遗留宽松行为”,比如:
-
with语句被完全禁止(无法再用它动态绑定作用域) - 未声明变量直接赋值会抛出
ReferenceError,而不是自动挂到window或globalThis -
arguments.callee和arguments.caller不可用(影响递归匿名函数写法) - 函数参数名重复(如
function f(a, a) {})会立即报SyntaxError -
this在非对象调用场景下不再指向全局对象,而是undefined(比如单独调用f())
严格模式怎么启用?作用域范围要注意什么
启用方式只有两种,且必须是**字符串字面量**、**位于脚本或函数体顶部**:
- 整个脚本启用:
"use strict";放在文件最开头(前面不能有空行或注释) - 仅函数内启用:
"use strict";放在函数第一行(包括箭头函数不支持,只能用于function声明或表达式)
注意:"use strict" 不会跨作用域继承。一个函数启用了,它的内部嵌套函数不会自动启用;模块(.mjs 或 import 加载的脚本)默认就是严格模式,无需手动加。
立即学习“Java免费学习笔记(深入)”;
严格模式解决了哪些真实开发中的坑?
它主要堵住三类问题:
-
静默失败 → 显式报错:比如给只读属性赋值(
Object.defineProperty(obj, 'x', {writable: false}))、删除不可配置属性,非严格模式下返回false或静默忽略,严格模式直接TypeError -
歧义语法 → 明确禁止:八进制字面量(
010)在严格模式下非法,避免与十进制混淆;delete操作符不能用于变量、函数名或参数(delete x报错) -
意外全局污染 → 立即拦截:忘记
var/let/const就赋值,以前会悄悄创建全局变量,现在直接ReferenceError
现在还用手动加 "use strict" 吗?
大多数现代场景已不需要显式添加:
- ES6 模块(
import/export)默认启用严格模式 - 使用 Babel、TypeScript、Vite、Webpack 等构建工具时,输出代码通常已处于严格上下文
- Node.js 的
.mjs文件也是严格模式
但如果你写的是独立的 .js 脚本、需要兼容老环境、或在 eval 中执行代码,仍需主动加。另外,严格模式对 eval 的影响很隐蔽:在严格模式下调用 eval,其内部也进入严格模式,且不能访问外层变量(除非显式传入)。











