导读:本期聚焦于小伙伴创作的《什么是JavaScript的Hoisting现象_变量和函数声明提升如何运作?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《什么是JavaScript的Hoisting现象_变量和函数声明提升如何运作?》有用,将其分享出去将是对创作者最好的鼓励。

JavaScript的Hoisting(声明提升)是语言编译阶段的一个特性,指的是变量和函数的声明会在代码正式执行前被提升到当前作用域的顶部,但赋值操作并不会跟随提升。这个特性会导致一些看似不符合直觉的代码执行结果,下面我们先通过一张示意图直观了解提升的基本表现。

什么是JavaScript的Hoisting现象_变量和函数声明提升如何运作?

变量声明的提升规则

var声明的变量提升

使用var声明的变量会提升到当前函数作用域或全局作用域的顶部,同时会被初始化为undefined,直到执行到赋值语句时才会被赋予实际的值。

// var声明提升示例
console.log(a); // 输出 undefined
var a = 10;
console.log(a); // 输出 10

// 上面的代码实际执行逻辑等同于
var a; // 声明提升到顶部,初始化为undefined
console.log(a);
a = 10; // 赋值操作留在原位置
console.log(a);

let和const声明的变量提升

使用letconst声明的变量也会被提升,但是不会被初始化,在声明语句之前访问这些变量会触发暂时性死区(TDZ)错误,这也是为什么let和const不存在重复声明问题的原因之一。

// let声明提升示例
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 20;

// const声明同理,且必须在声明时赋值
console.log(c); // 报错:Cannot access 'c' before initialization
const c = 30;

函数声明的提升规则

函数声明的提升

函数声明会被整体提升到当前作用域的顶部,包括函数体,因此在函数声明之前就可以调用该函数。

// 函数声明提升示例
sayHello(); // 输出 你好,世界

function sayHello() {
  console.log('你好,世界');
}

函数表达式的提升

函数表达式本质是变量赋值,提升规则遵循变量的提升规则:如果是var声明的函数表达式,变量会提升并初始化为undefined,在赋值前调用会报错;如果是let/const声明的函数表达式,同样会触发暂时性死区错误。

// var函数表达式示例
sayHi(); // 报错:sayHi is not a function
var sayHi = function() {
  console.log('Hi');
};

// 上面的代码实际执行逻辑
var sayHi;
sayHi(); // 此时sayHi是undefined,不是函数,调用报错
sayHi = function() {
  console.log('Hi');
};

优先级与特殊情况

当变量声明和函数声明同名时,函数声明的优先级更高,会覆盖同名的变量声明,但是变量赋值会覆盖函数声明。

// 同名声明优先级示例
console.log(foo); // 输出 [Function: foo]
var foo = '我是变量';
function foo() {
  console.log('我是函数');
}
console.log(foo); // 输出 我是变量

// 实际执行逻辑
function foo() { // 函数声明先提升
  console.log('我是函数');
}
var foo; // var声明提升,但是和已有函数同名,不会重复声明
console.log(foo); // 此时foo还是函数
foo = '我是变量'; // 赋值操作覆盖函数
console.log(foo); // 此时foo是字符串

Hoisting的原理说明

JavaScript引擎在执行代码前会先进行编译阶段,这个阶段会收集所有的声明(变量声明、函数声明),并把它们加入到对应的作用域中,这就是提升的本质。赋值操作属于执行阶段的代码,不会被提前处理,因此才会出现声明提前但赋值留在原位置的情况。

理解Hoisting的核心是要区分声明和赋值的执行阶段,同时掌握不同声明关键字(var/let/const)和不同函数定义方式(声明/表达式)的规则差异,这样就能准确预判代码的执行结果,避免因为提升特性导致的逻辑错误。

JavaScriptHoisting变量声明提升函数声明提升作用域修改时间:2026-06-25 00:27:14

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。