Class内部所有代码默认运行在严格模式下,是ES6语言规范的硬性约定,无需也不应手动添加"use strict";它禁用隐式全局、强制this为undefined、禁止重复参数等,以保障类的行为安全与一致性。

Class 方法自动处于严格模式,不是因为开发者手动加了 "use strict",而是 JavaScript 引擎在设计 class 时就把它整体纳入了严格模式的执行上下文。这是语言规范层面的硬性约定,和模块(module)一样,class 内部天然就是严格模式环境。
类本身就是严格模式的“安全区”
ES6 明确规定:所有在 class 声明或类表达式内部定义的内容——包括 constructor、普通实例方法、static 方法、getter/setter——全部运行在严格模式下。你不需要、也不允许在里面写 "use strict",写了也不会报错,但它是冗余的。
- 严格模式禁用隐式全局变量,避免
this指向window或globalThis - 禁止函数参数重名,比如
constructor(a, a) { }会直接报语法错误 - 对
eval和arguments的限制更严格,防止意外覆盖或污染
为什么这样设计?
类是面向对象编程的抽象结构,强调封装性与行为一致性。如果允许非严格模式,很多容易出错的行为(比如忘记 new 调用、this 意外绑定到全局、静默失败的赋值)就会破坏类的可靠性。
- 比如把一个实例方法单独提取出来调用:
const fn = obj.method; fn();—— 在非严格模式下,this会指向全局对象;在 class 中,它直接是undefined,立刻暴露问题 - 又如构造器必须用
new调用,否则抛TypeError,这个检查只在严格模式下才强制生效 - 方法不可枚举、不能被
for...in遍历,也依赖严格模式下的属性描述符默认行为
这和普通函数有什么区别?
普通函数默认是非严格模式,除非显式声明 "use strict";而 class 是“自带防护”的语法结构。你可以对比:
-
function Foo() { this.x = 1; }—— 不加"use strict",this可能意外丢失 -
class Foo { constructor() { this.x = 1; } }—— 无需声明,this绑定始终受控,且任何非法操作(如重复参数、八进制字面量)都会立即报错
实际开发中要注意什么?
虽然 class 自动严格,但你仍需注意边界情况:
- 不要试图在 class 内部用
"use strict",它没意义,也不影响行为 - 如果你把 class 方法赋值给变量再调用(如事件回调),要记得手动绑定
this,或用箭头函数包裹 - 继承时子类的
constructor必须先调用super(),否则报错——这也是严格模式强制保障的初始化顺序

















