函数声明提升优先级高于变量提升,且在预编译阶段先完成;函数声明完整提升(函数名与函数体一同绑定),var仅提升声明(初始值undefined);同名时函数先就位,var赋值可覆盖;函数表达式、let/const不参与提升;多个同名函数声明,后声明的覆盖先声明的。

函数声明提升优先级高于变量提升,且在预编译阶段先完成。
函数声明完整提升,var 只提升声明
JavaScript 引擎在创建执行上下文时,先扫描所有 function 关键字开头的声明,把函数名和整个函数体一起绑定到作用域中;之后才处理 var 声明,仅将变量名挂起,初始值为 undefined。
-
console.log(foo)放在function foo() {}前面 → 输出函数本身 -
console.log(bar)放在var bar = 1前面 → 输出undefined
同名时函数先“就位”,var 赋值可覆盖它
当函数声明与 var 声明同名,函数在预编译阶段已绑定;var 的声明部分被忽略(标识符已存在),但后续赋值语句仍会执行,从而覆盖函数值。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
-
function a() {}; var a = 2;→ 最终a是数字2 -
var a; function a() {};→a仍是函数(无赋值,不覆盖) -
function a() {}; a = 3;→ 同样覆盖为数字3
函数表达式、let/const 不参与函数级提升
只有 function name() {} 形式才算函数声明;const fn = function() {}、let fn = () =>{}、class 或方法简写都属于表达式或块级声明,不享受函数提升特权。
立即学习“Java免费学习笔记(深入)”;
-
fn(); const fn = () => {};→ 报ReferenceError -
fn(); let fn = function() {};→ 进入暂时性死区(TDZ),同样报错 -
fn(); var fn = function() {};→ 输出undefined(仅变量提升,函数体未提升)
多个同名函数声明,后声明的覆盖先声明的
函数声明之间也存在覆盖关系,且发生在提升阶段:后出现的同名函数声明会直接替换前一个,无需等到执行阶段。
-
function a() { return 1; }; function a() { return 2; };→ 调用a()返回2 - 这种覆盖是静态的,在代码解析完成时就已确定

















