讲师中心 微信公众号
AI工具推荐 视频效率加速

如何理解javascript执行上下文_变量提升的机制是什么

小涛小哥_4554

小涛小哥_4554

发布时间:2025-12-27 20:47:39

|

307人浏览过

|

来源于php中文网

原创

JavaScript执行上下文与变量提升是同一机制的两面:引擎在创建执行上下文时预处理声明(var/function),将其注入变量对象(VO)并初始化,而let/const仅声明不初始化(TDZ)。

如何理解javascript执行上下文_变量提升的机制是什么

JavaScript 执行上下文和变量提升,本质上是同一个运行机制的两个表现侧面:引擎在执行代码前,会先做一次“预处理”,把声明类信息(var、function)提前收集并初始化,这个过程发生在执行上下文创建阶段。

执行上下文是什么

每次函数被调用,或脚本首次运行时,JS 引擎都会创建一个执行上下文(Execution Context),它是代码执行时的“环境容器”,包含三个核心部分:

  • 变量对象(VO):存放当前作用域中所有变量、函数声明;全局环境下叫全局对象(GO),函数内叫活动对象(AO)
  • 作用域链(Scope Chain):用于标识符查找,由当前上下文的变量对象 + 外层上下文的变量对象组成
  • this 值:取决于函数如何被调用,与上下文创建方式有关

注意:只有 var 和 function 声明会被纳入 VO 并参与“提升”,let、const 和 class 虽然也存在“声明提升”,但不初始化(处于暂时性死区 TDZ),访问会报错。

变量提升具体怎么发生

所谓“提升”,不是代码真的被移动到顶部,而是声明在编译阶段(进入执行上下文时)就被注册进变量对象,并赋予初始值:

立即学习“Java免费学习笔记(深入)”;

  • var a = 10; → 提升为 var a;(初始化为 undefined),赋值语句仍留在原位置
  • function foo() { } → 整个函数定义被提升,包括名字和函数体,可立即调用
  • var bar = function() {}; → 只有 var bar; 被提升(bar 初始化为 undefined),等号右边的函数表达式不会提升

例如:

Comprehensive Three.js 3D graphics reference
Comprehensive Three.js 3D graphics reference

详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。

下载
console.log(a); // undefined
console.log(b); // ReferenceError(b 是 let 声明)
foo(); // 正常执行
bar(); // TypeError: bar is not a function

var a = 1;
let b = 2;
function foo() { return 'ok'; }
var bar = function() {};

为什么函数声明比 var 更“靠前”

在同一个作用域中,如果函数名和变量名冲突,函数声明优先级更高,且会在变量声明之前被处理。引擎在填充 VO 时,顺序是:

  • 先处理所有 function 声明(覆盖同名变量)
  • 再处理 var 声明(不覆盖已存在的函数名)

所以:

console.log(typeof foo); // "function"
var foo = 1;
function foo() {}

这段代码中,foo 最终是函数;但如果写成 var foo = 1; function foo() {},结果一样——因为函数声明已在预处理阶段写入 VO,var foo = 1 的赋值只是后续执行阶段的操作。

实际开发中要注意什么

变量提升容易引发隐式行为和 bug,建议养成明确、可预测的书写习惯:

  • 始终在作用域顶部声明所有 var 变量(即使不立即赋值)
  • 优先使用 const / let 替代 var,避免变量提升带来的困惑
  • 函数尽量统一用函数声明(function name() {})或箭头函数(const fn = () => {}),少用函数表达式赋值给 var
  • 不要依赖提升来调用尚未“出现”的函数或变量,代码应自上而下可读

理解执行上下文的生命周期(创建 → 执行 → 销毁)和其中的变量对象行为,就能自然看懂为什么某些变量能访问、某些报错、某些值是 undefined——它不是语法糖,而是 JS 引擎实实在在的执行规则。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

11440

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

963

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

6850

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

2702

2025.08.07

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1938

2023.09.20

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

3236

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

286

2025.12.06

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

3836

2023.06.20

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn