es6 的 class 语法默认启用严格模式,包括构造函数、实例方法、静态方法及类体顶层语句;此举禁止非 new 调用、隐式全局变量、重复参数等隐患,提升代码安全性与可预测性。

ES6 的 class 语法默认启用严格模式,这不是可选项,而是语言规范强制行为。你不需要写 "use strict",只要用了 class,内部就自动运行在严格模式下——包括构造函数、所有实例方法、静态方法,以及类体顶层语句。
为什么 class 必须运行在严格模式下
这是为了消除 ES5 构造函数中常见的隐患,比如:
- 忘记用
new调用时,this指向全局对象(如window),容易污染全局作用域; - 允许给未声明变量赋值,导致静默创建全局属性;
- 允许重复参数名、八进制字面量、
with语句等易错特性。而
class通过内置[[IsConstructor]]属性,从机制上禁止非new调用,并配合严格模式的约束,让错误提前暴露。class 中严格模式带来的关键限制
这些限制不是“建议”,而是执行时必然生效的规则:
-
不能省略
new:直接调用MyClass()会抛出TypeError; -
变量必须先声明再使用:在
constructor或方法中写count = 1(未用let/const/var)会报ReferenceError; -
禁止删除不可配置属性:比如
delete this.name在实例方法中会失败; -
函数参数名不可重复:构造函数写成
constructor(x, x)直接语法错误; -
this在普通函数中不会自动绑定到全局:比如把实例方法解构后单独调用,this是undefined,而非window。如何正确遵守这些限制
日常开发中,重点注意三点:
-
始终用
new创建实例:尤其在事件回调、定时器、高阶函数中避免漏掉,例如setTimeout(() => new MyClass(), 100),而不是setTimeout(MyClass, 100); -
显式声明构造函数参数和实例属性:不要依赖隐式挂载,
constructor(x, y) { this.x = x; this.y = y; }是标准写法; -
避免在 class 内部使用被禁用的语法:如
with、arguments.callee、八进制数字(010)、删除变量(delete count)等,它们在 class 中要么报错,要么无效。与普通函数对比更清楚
ES5 构造函数在非严格模式下可能“侥幸运行”,比如:
function Person(name) { this.name = name; }
Person('Alice'); // 不报错,但 this 指向 window,name 成了全局变量而 class 完全切断这种路径:
class Person { constructor(name) { this.name = name; } }
Person('Alice'); // TypeError: Class constructor Person cannot be invoked without 'new'这种强制性不是限制,而是保护——它让代码行为可预测,减少低级错误蔓延。
-
始终用
-
不能省略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











