class体内部自动启用严格模式是es6规范的强制要求,所有类声明和表达式的整个类体(含constructor、方法、getter/setter等)均默认运行在严格模式下,无需"use strict",且不受外部脚本模式影响。

Class 体内部自动启用严格模式,不是设计上的“便利”,而是 ES6 规范的强制要求——它从语言层面保障类的行为一致性与安全性。
这是规范明确规定的默认行为
ES6 标准规定:所有类声明(class A {})和类表达式(const B = class {})的整个类体(包括 constructor、普通方法、getter/setter、静态方法等)都运行在严格模式下。无需写 "use strict",也不受外部脚本是否严格的影响。
- 哪怕整个脚本是松散模式,只要代码写在 class 内部,就自动进入严格模式
- 模块(.mjs 文件或 import/export 环境)内部同样默认严格模式,与 class 并列作为两大“自动严格”场景
- 这种设计让 class 不再依赖开发者手动加指令,消除了遗漏风险
为什么必须这样设计?
类的语义比普通函数更“面向对象”,很多松散模式下的不安全行为会破坏其可靠性:
- this 在类方法中不能隐式绑定到全局对象(如 window 或 globalThis),否则继承、箭头函数、事件回调等场景极易出错
- 禁止意外创建全局变量(比如忘记写 let/const 直接赋值),避免污染命名空间
- 禁止删除不可配置属性、重复参数名、八进制字面量等易引发歧义的语法,让类结构更可预测
- 确保 super() 调用检查、new.target 行为、私有字段(#field)等新特性有统一执行基础
实际影响:你写的代码已经“被严格”了
不需要额外操作,但要注意几个典型表现:
- 把类里的方法赋值给变量再调用(const fn = obj.method; fn()),此时 this 是 undefined,而非指向全局对象
- 类中直接写 arguments 或 eval 会受限,比如无法通过 eval 动态修改作用域变量
- 尝试给只读属性赋值、删除不可删属性,会立即抛出 TypeError,而不是静默失败
- 子类构造器中未调用 super() 会报 ReferenceError,这是严格模式下对 this 初始化的强制约束
它和模块一起,构成了现代 JS 的安全基线
ES6 把 class 和 module 定义为“天然严格”的语法单元,本质上是在推动整个语言向更健壮、更可维护的方向演进。你写 class,就是在用严格模式;你写模块,也一样。这不是可选项,而是现代 JavaScript 的默认现实。











