函数声明会完整提升至作用域顶部且优先级高于var声明;同名时函数生效,后续赋值可覆盖;let/const及函数表达式无提升,处于暂时性死区。

函数声明会完整提升到作用域顶部,优先级高于 var 变量声明;同名时函数声明生效,直到后续赋值覆盖它。
函数声明完全提升,变量声明只提升名称
函数声明如 function foo() {} 会被整个定义(包括函数体)提前到作用域最上方。而 var foo = ... 仅把 foo 这个标识符声明提升,赋值部分仍保留在原位置,执行时才发生。
-
console.log(foo); function foo() {}→ 输出函数本身 -
console.log(foo); var foo = 1;→ 输出undefined(声明提升但未赋值) -
console.log(foo); function foo() {} var foo = 1;→ 输出函数,因为函数声明优先被处理
同名冲突时:函数胜出,赋值覆盖
当函数声明与 var 声明同名,JS 引擎在预编译阶段先处理函数声明,再处理 var 声明——但后者若已存在同名函数,则不会重复声明,只保留赋值动作。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
function a() {} var a;→a是函数 -
function a() {} var a = 10;→ 先是函数,执行到var a = 10时,a被赋值为10,函数被覆盖 -
var a; function a() {}→ 效果等同于上面第一种,函数仍胜出
let/const 和函数表达式不享受函数声明级提升
let foo = function() {} 或 const bar = () => {} 属于函数表达式 + 块级绑定,它们没有“声明提升”,而是处于暂时性死区(TDZ)。在声明前访问会直接报 ReferenceError。
-
console.log(foo); let foo = function() {}→ 报错,不可访问 -
console.log(bar); const bar = () => 42;→ 同样报错 -
function baz() {}是声明;const baz = function() {}是表达式,二者本质不同
常见误区提醒
不要混淆“提升存在”和“可安全使用”。函数声明虽提升,但若被后续赋值覆盖,调用就会失败;var 提升带来 undefined 而非报错,容易掩盖逻辑问题;let/const 的 TDZ 行为更严格,也更利于早期发现错误。
- 箭头函数、
class声明都不具备函数声明的提升能力 -
function关键字开头的才是函数声明;var/let/const开头的都是表达式 - 多个
function同名声明时,最后一个生效(覆盖前面的)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










