class声明仅绑定提升但受tdz限制,未执行前访问会报错;函数声明则完全提升,可前置调用;函数与类表达式均不提升,需先定义后使用。

Class 声明不会像函数声明那样“完全提升”,它虽然会被词法绑定到作用域,但受时间性死区(TDZ)限制——在声明语句执行前访问类名会直接报错。
函数声明可被完全提升
函数声明在代码执行前就完成初始化,允许在声明前调用:
- 合法:`foo(); function foo() { console.log('ok'); }`
- 引擎把整个函数体提升到作用域顶部,调用时已就绪
Class 声明只做“绑定提升”,不初始化
class 关键字会让标识符提前进入作用域,但直到执行到 class 语句时才真正初始化;此前访问会触发 ReferenceError:
- 报错:`new MyClass(); class MyClass {}` → Cannot access 'MyClass' before initialization
- 即使只是 typeof 或 instanceof 操作,只要在 class 行之前,也会失败
函数表达式和类表达式行为一致
两者都不提升,必须先定义再使用:
- 都报错:`Foo(); const Foo = function() {};` 和 `Bar(); const Bar = class {};`
- 它们属于“赋值操作”,绑定和初始化同步发生,不存在 TDZ 区分
实际开发中要注意的点
避免在模块顶部依赖类的前置使用,尤其在循环依赖或条件分支中:
- 不要在 import 语句前写 new 某个尚未声明的 class
- 动态创建实例时,确保 class 已执行到声明行(比如放在 IIFE 内部或模块末尾)
- 工具链(如 Babel)转译 class 时通常不模拟 TDZ,但原生环境严格遵循
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











