函数声明提升优先级高于var声明,会完整提升并覆盖同名var声明;let/const不参与该机制且存在暂时性死区;函数表达式仅变量名提升,函数体不提升。

函数提升的优先级更高。
函数声明会完整提升,且压过同名变量声明
当函数声明和 var 变量声明使用相同名称时,JavaScript 引擎在预编译阶段会先处理函数声明,并将其整个函数体提升到作用域顶部;随后处理 var 声明,但若发现同名标识符已被函数声明占用,则忽略该 var 的声明(不是赋值,是声明本身被跳过)。
-
例如:
function foo() {}和var foo;同时存在 → 最终foo是函数,不是undefined -
再如:
function foo() { return 1; }后跟var foo = 2;→ 第一次访问foo得到函数,执行赋值后才变成数字2
var 变量只能“覆盖”函数,不能“抢占”位置
函数提升发生在编译阶段最前,var 声明提升紧随其后,但不会推翻已存在的函数绑定。只有执行阶段的赋值语句(foo = 2)才会真正改变值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
console.log(foo);// 输出函数体(因函数已提升) -
var foo = 10;// 这行只做赋值,不重新声明 -
console.log(foo);// 输出10,函数被覆盖
let/const 不参与这种竞争,它们有暂时性死区
用 let 或 const 声明同名变量时,即使有函数声明,只要在声明前访问,就会报 ReferenceError。因为它们虽有声明提升,但不初始化,处于 TDZ(暂时性死区)。
立即学习“Java免费学习笔记(深入)”;
-
console.log(bar);// 报错,哪怕下面有function bar() {} - 这说明:函数提升对
let/const不构成“优先级压制”,二者不在同一套机制里
函数表达式不享受函数提升,只按变量规则走
const fn = function() {} 或 var fn = () =>{} 中的 fn 只是普通变量,仅变量名被提升(undefined),函数体不提升。
- 调用
fn()在声明前会报TypeError: fn is not a function - 它和
var fn;行为一致,和function fn(){}完全不同

















