Class不会提升,因其被设计为块级作用域绑定、受TDZ约束的声明形式,与let/const一致;必须先声明后使用,提前访问(如typeof、new)均报ReferenceError,且子类必须位于父类之后以确保继承正确。

Class 声明完全不提升
你不能在 class 定义之前 使用它,哪怕只是 typeof、instanceof 或 new:
-
console.log(MyClass); class MyClass {}→ 报ReferenceError -
new MyClass(); class MyClass {}→ 同样报错,不是undefined或TypeError - 哪怕写成
{ class A {} new A() },也必须严格按顺序:先声明,后使用
类表达式只提升变量声明,不提升赋值
当你用 const MyClass = class {} 这种方式时,行为取决于变量声明方式:
-
const/let:变量名被提升到作用域顶部,但初始化(即 class 定义)仍按代码顺序执行;访问未赋值前的变量 →ReferenceError -
var(不推荐):变量声明和初始值都会被提升,但 class 本身无法被调用(因为 class 不能被var初始化提升) - 常见陷阱:
console.log(MyClass); const MyClass = class {};→ 直接报错,不会输出undefined
不提升的实际影响
这个规则直接影响模块组织和依赖逻辑:
- 子类必须写在父类之后:
class Child extends Parent {}要求Parent已定义,否则继承失败 - 循环依赖更可控:避免因提升导致“父类未定义却已被引用”的隐性错误
- 与
let保持一致,强化块级作用域语义,减少意外访问未初始化状态
对比函数声明,为什么 function 可以提升?
函数声明提升是 ES5 遗留行为,而 Class 是 ES6 新增语法,没有沿用这一历史包袱:
-
function foo() {}整体提升(声明+赋值),所以foo()可以写在前面 -
class Foo {}没有提升,是为了避免构造函数被误用、确保this和原型链在定义时就明确 - 这也让
constructor的执行时机更可预测,尤其在继承链中

















