函数声明完全提升且优先于变量提升;函数表达式和var声明仅提升名称;let/const和箭头函数无提升,处于暂时性死区。

函数声明会被完全提升到作用域顶部,优先级高于变量提升;而函数表达式和变量声明一样,只提升名称不提升赋值。
函数声明优先于变量声明提升
当函数声明与同名变量声明共存时,函数声明会先被提升并覆盖变量声明的提升结果。即使变量声明写在函数声明之前,函数仍会生效。
- 函数声明(function foo() {})整个定义被提升
- 变量声明(var foo)仅提升声明,初始化(= ...)保留在原位置
- 若存在同名函数声明和 var 声明,函数声明胜出
函数表达式按变量规则处理
使用 var foo = function() {} 形式时,它本质是变量声明 + 函数赋值,因此只有 foo 名称被提升,值为 undefined,直到执行到赋值语句才获得函数引用。
- 此时调用会报 TypeError: foo is not a function
- 不同于函数声明,无法在声明前安全调用
let/const 不支持函数名提升
let 和 const 声明不存在“提升”意义上的初始化,它们处于“暂时性死区”(TDZ),在声明前访问会直接抛出 ReferenceError。
- 哪怕写的是 const foo = function() {},也不能在声明前访问 foo
- 函数声明若用 const 或 let 定义(如 const foo = function() {}),就不是函数声明,而是函数表达式 + 块级绑定
箭头函数和 class 声明同样不提升
箭头函数必须先定义再使用;class 声明虽有提升,但不会初始化,访问会触发 TDZ 错误——这点常被误解为“未提升”,实则是“已声明但未初始化”。
- class Foo {} 的类名 Foo 被提升,但不可在声明前实例化或继承
- () => {} 是表达式,无声明提升行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











