箭头函数不参与函数提升,仅变量名被提升且处于暂时性死区,必须执行赋值语句后才可用;它本质是函数表达式,执行顺序严格自上而下,与function声明的完全提升有根本区别。

箭头函数在定义阶段不执行,只完成变量声明和赋值;它遵循函数表达式的提升规则——仅变量名被提升,函数体不会提前可用。
箭头函数属于函数表达式,不参与“函数提升”
JavaScript 引擎在创建执行上下文时,会进行变量提升(hoisting):var 声明的变量名被提升并初始化为 undefined;而 const/let 声明的变量名虽被提升,但处于“暂时性死区”(TDZ),直到声明语句执行才可访问。箭头函数总是以 const 或 let 形式赋值,因此:
- 声明前访问会抛出 ReferenceError,而非 undefined
- 不存在“函数体被提升”的行为,与 function 声明完全不同
- 即使写成 const fn = () => {},也必须等到该行代码实际执行后,fn 才指向函数对象
执行顺序严格按代码从上到下逐行运行
箭头函数的定义语句本身是一条赋值语句,和其他 const/let 赋值一样,在执行阶段才真正发生。例如:
- console.log(add(1, 2)); // 报错:Cannot access 'add' before initialization
- const add = (a, b) => a + b;
- 引擎不会跳过第一行去预解析第二行;遇到第一行就尝试读取尚未初始化的 add,直接报错
同名覆盖与重复声明受块级作用域约束
使用 const 声明的箭头函数不可重复赋值;用 let 可重新赋值,但不能在同一作用域重复声明。例如:
- let fn = () => "first"; fn(); // "first"
- fn = () => "second"; fn(); // "second"
- 若换成 const,则第二行赋值会报 TypeError
- 在不同块中(如 if 或函数内),let/const 允许同名但互不影响
与普通函数声明的关键区别在于执行时机
function 声明会被完全提升,可在定义前调用;箭头函数没有这种能力,它的存在依赖于赋值语句的执行。这是语法本质决定的:
- function 声明是独立的语句类型,引擎单独处理
- 箭头函数只是表达式,必须依附于变量声明或参数传递等上下文才能存在
- 哪怕写成 (a, b) => a + b 这样的裸表达式,不赋值给变量或传给其他函数,也不会产生任何效果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











