导读:本期聚焦于小伙伴创作的《JavaScript变量提升机制到底是什么?如何理解执行上下文中的作用域绑定》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《JavaScript变量提升机制到底是什么?如何理解执行上下文中的作用域绑定》有用,将其分享出去将是对创作者最好的鼓励。

JavaScript在代码执行之前,引擎会先做一次编译处理,这个过程会创建执行上下文并把变量与函数声明提前安排好,这就是大家常说的变量提升。执行上下文决定了当前代码能够访问哪些标识符,以及这些标识符如何与作用域绑定。

JavaScript变量提升机制到底是什么?如何理解执行上下文中的作用域绑定

什么是执行上下文

每当JavaScript开始运行一段代码,比如全局代码或一个函数体,就会生成一个执行上下文。它主要包含词法环境、变量环境以及this的指向。在上下文创建阶段,引擎会扫描代码中的声明,将函数声明和var声明的变量放入环境记录中。

创建阶段发生了什么

  • 函数声明整体提升,可以直接调用
  • var声明的变量提升并初始化为undefined
  • let和const也会提升但处于暂时性死区,不能提前访问

变量提升的实际表现

看下面这段例子,我们在声明之前使用变量,并不会报错而是得到undefined:

// 变量提升示例
console.log(myName); // 输出 undefined
var myName = '张三';
console.log(myName); // 输出 张三

// 函数声明提升
sayHello(); // 输出 hello
function sayHello() {
  console.log('hello');
}

上面代码中,var myName 的声明被提升到作用域顶部,但赋值留在原处,所以第一次打印是undefined。函数声明sayHello则被完整提升,因此可以提前调用。

let和const为什么不同

使用let或const声明的变量同样有提升动作,但引擎把它们放在暂时性死区中,在声明语句之前访问会直接抛错。

// let的暂时性死区
console.log(age); // 报错 ReferenceError
let age = 18;

执行上下文与作用域绑定

每一个执行上下文都有自己的词法环境,里面保存了当前作用域的绑定关系。当代码在一个函数内查找变量时,会先搜当前函数的环境,找不到再沿外层环境向上查找,这就是作用域链。变量提升只在当前执行上下文内有效,不会跨上下文把变量提到其他函数里。

声明方式是否提升初始值
varundefined
function函数体
let/const是(死区)未初始化

小结建议

为了避免变量提升带来的混乱,推荐始终在作用域顶部声明变量,优先使用let和const代替var。理解执行上下文的创建和运行两个阶段,可以让你准确预测代码行为,减少调试时间。

JavaScript变量提升执行上下文修改时间:2026-07-27 16:00:23

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