函数声明优先级高于var变量声明。函数名与函数体整体提升至作用域顶部,var仅提升变量名并初始化为undefined;同名时函数先生效,赋值后覆盖为变量值;函数表达式和let/const不参与此提升机制。

函数声明的优先级更高。
函数先完整提升,变量只声明不赋值
在 JavaScript 执行前的创建阶段,引擎会先扫描所有 函数声明(function foo() {}),把函数名和整个函数体一起提升到作用域顶部;之后才处理 var 声明,仅提升变量名,初始值为 undefined。
- 即使函数写在
var语句后面,也能在代码开头被调用 -
var a = 1;和function a() {}同名时,a初始指向函数
变量赋值后会覆盖函数
函数虽然先被提升并可用,但一旦同名的 var 变量执行了赋值操作,就会覆盖函数引用。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
var a; console.log(typeof a); // "function"a = 42; console.log(typeof a); // "number"- 此时再调用
a()会报错:TypeError: a is not a function
注意:只适用于函数声明,不适用于函数表达式
像 var b = function() {} 或 const c = () => {} 这类写法属于函数表达式,它们遵循 var 的提升规则——只有变量名被提升,值仍是 undefined,不能提前调用。
- 函数表达式没有“函数体提升”,不可在声明前执行
- 同名的函数声明 + 函数表达式赋值,仍按“函数先提、赋值后盖”逻辑走
let/const 不参与这种提升竞争
let 和 const 声明存在“暂时性死区”(TDZ),不会被提升到可访问状态。哪怕与函数同名,也不会发生覆盖或忽略,而是在声明前访问直接报 ReferenceError。
-
console.log(d); let d = 1;→ 报错,不进入变量提升流程 - 它和函数提升不在同一套机制里,不存在优先级比较
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










