函数提升优先级高于变量提升,因函数声明在编译阶段被完整提升并绑定函数体,而var声明仅创建undefined标识符且同名时被忽略;let/const不参与此机制,处于暂时性死区。

函数提升的优先级高于变量提升,核心在于 JavaScript 引擎在编译阶段(预解析)处理声明的顺序和方式不同:函数声明会被完整地、无条件地提升到作用域顶部;而 var 变量声明仅把“声明”提升,赋值仍留在原处,且若与已提升的函数同名,该 var 声明会被直接忽略。
函数声明先被完整加载
当引擎扫描代码时,会优先识别并处理 function 函数名() {} 这类函数声明。它不仅把函数名提升,还把整个函数体一起绑定到作用域中。这意味着你在声明之前就能调用它:
foo(); // 正常执行,输出 "hello"function foo() { console.log("hello"); }
var 声明只占位,不抢位置
var 声明会在同一阶段被处理,但仅做两件事:在作用域中创建一个标识符,并初始化为 undefined。如果这个标识符名已经由函数声明占用了,var 的声明步骤就跳过——不是覆盖,而是压根不执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
console.log(bar); // 输出函数体function bar() { return 1; }var bar = 2;- 此时第一次访问 bar 得到的是函数,因为
var bar的声明没生效;只有执行bar = 2后,值才被改写
同名冲突时,函数赢在编译期
关键不是“谁写在前面”,而是“谁在编译阶段先被绑定”。即使 var 写在函数声明之前,函数仍会胜出:
var baz = "first";function baz() { return "second"; }console.log(baz); // 输出函数,不是字符串也不是 undefined
这是因为引擎先扫函数,baz 已绑定为函数;再扫 var 时发现重名,直接跳过声明,只保留赋值语句(baz = "first")留待执行阶段运行。
let/const 不参与这场竞争
它们虽有声明提升,但不初始化,处于暂时性死区(TDZ)。哪怕上面有同名函数声明,只要在 let/const 声明前访问,就会报 ReferenceError,而不是得到函数或 undefined。这说明它们和 var + function 的提升机制不在同一套规则里。
console.log(qux); // 报错!function qux() {}let qux = 42;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










