函数声明会整体提升,类声明不提升;函数可在定义前调用,类在声明前访问会因tdz报referenceerror,且类内部自动启用严格模式。

类声明确实不提升,而函数声明会整体提升——这是最直接、最实用的识别方式。关键不在语法长得像不像,而在“能不能在定义前调用”。
看能不能提前使用
函数声明允许在定义语句之前调用,引擎会在预解析阶段把它挂进作用域;类声明则不行,哪怕只是 typeof MyClass 或 new MyClass(),只要出现在声明之前,一律报 ReferenceError: Cannot access 'MyClass' before initialization。
看错误类型和时机
- 函数声明提前调用:如果函数还没定义,但用了 var 声明同名变量,可能得 undefined 或报错,但不会是 TDZ 类型错误
- 类声明提前访问:必定是 ReferenceError,且提示明确指向“before initialization”,这是暂时性死区(TDZ)的典型特征,和 let/const 行为一致
看声明位置与执行顺序的关系
把声明挪到文件末尾试试:
- 函数仍能正常运行——说明它被“提上去了”
- 类直接崩溃——说明它严格按代码顺序执行,没被移动
看是否受严格模式隐式影响
类内部自动启用严格模式,且无法关闭;函数声明则不受此限。虽然这不直接影响提升判断,但配合 TDZ 错误一起出现时,能帮你确认遇到的是类而非普通函数。
不复杂但容易忽略










