class语法强制启用严格模式,所有类体代码(含constructor、方法、getter/setter等)默认运行在严格模式下,无需手动添加"use strict",且能确保this绑定、禁止全局变量隐式创建、统一新特性执行基础。

Class 语法内部自动启用严格模式,是 ES6 规范的硬性要求,不是可选项,也不依赖开发者手动添加 "use strict"。
class 本身就是严格模式的“安全区”
所有 class 声明(class A {})和类表达式(const B = class {})的整个类体——包括 constructor、普通方法、静态方法、getter/setter、私有字段访问逻辑——全部默认运行在严格模式下。
- 即使外部脚本是松散模式,只要代码写在 class 内部,就立即进入严格模式
- 模块(
.mjs或含import/export的文件)也同属“自动严格”场景,与 class 并列构成现代 JS 的安全基线 - 在 class 中写
"use strict"是冗余的,不会报错但毫无作用
为什么必须强制严格?
类作为面向对象的核心抽象,需要更可靠的行为边界。非严格模式下的宽松行为会破坏封装性和可预测性:
-
this在方法中不会隐式绑定到window或globalThis,避免继承、事件回调等场景出错 - 禁止意外创建全局变量(如忘记
let/const直接赋值),防止命名空间污染 - 禁止重复参数名(
constructor(a, a))、八进制字面量(010)、with语句等易引发歧义的语法 - 确保
super()调用检查、new.target行为、私有字段(#field)等新特性有统一执行基础
实际开发中要注意的表现
你写的 class 代码已经“被严格”了,无需额外操作,但需留意这些典型反应:
- 把实例方法赋值给变量再调用(
const fn = obj.method; fn()),此时this是undefined,而非指向全局对象 - 子类构造器中未调用
super()会立即抛ReferenceError,这是对this初始化的强制约束 - 尝试给只读属性赋值、删除不可配置属性、使用
arguments或eval修改作用域变量,都会直接抛TypeError或语法错误 - 方法默认不可枚举,
for...in遍历不到,这也是严格模式下属性描述符的默认行为
它和普通函数有本质区别
普通函数默认是非严格模式,必须显式加 "use strict" 才生效;而 class 是语言层面自带防护的语法结构:
-
function Foo() { this.x = 1; }:不加"use strict",this可能意外丢失或绑定到全局 -
class Foo { constructor() { this.x = 1; } }:无需声明,this绑定始终受控,非法操作(如重复参数、八进制字面量)立刻报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











