尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JavaScript高级系列(三) - JavaScript的运行过程
一. 全局代码的执行过程1.1. ECMA的版本说明在ECMA早期的版本(ECMAScript3),代码的执行流程的术语和ECMAScript5以及之后的术语会有所区别:目前网上大多数流行的说法都是基于ECMAScript3版本的解析,并且在面试问到的大多数都是ECMAScript3的版本内容;ECMAScript3终将过去, ECMAScript5必然会成为主流,所以最好也理解ECMAScript5甚至包括ECMAScript6以及更好版本的内容;事实上在TC39( ECMAScript5 )的最新描述中,和ECMAScript5之后的版本又出现了一定的差异;那么按照如下顺序学习:a. 通过ECMAScript3中的概念学习JavaScript执行原理、作用域、作用域链、闭包等概念;b. 通过ECMAScript5中的概念学习块级作用域、let、const等概念;它们只是在对某些概念上的描述不太一样,在整体思路上都是一致的。1.2. 全局代码初始化假如我们有下面一段代码,它在JavaScript中是如何被执行的呢?varname="wulin"functionfoo(){varname="foo"console.log(name)}varnum1=20varnum2=30varresult=num1+num2foo()1.2.1. 初始化全局对象js引擎会在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO) 该对象 所有的作用域(scope)都可以访问;里面会包含Date、Array、String、Number、setTimeout、setInterval等等;其中还有一个window属性指向自己;1.2.2. 执行上下文(EC)在 JavaScript 引擎内部,有一个执行上下文栈(Execution Context Stack,简称 ECS),它是用于执行代码的调用栈,存储着当前正在执行的执行上下文。当 JavaScript 引擎开始执行代码时,它会先创建一个全局执行上下文(Global Execution Context,简称 GEC),并将其推入 ECS 中,表示当前正在执行全局的代码块。GEC 包含了两部分内容:第一部分是在代码执行前,JavaScript 引擎会扫描全局作用域下的变量和函数,将它们添加到全局对象(Global Object)中,并分配内存空间,但是并不会赋值。这个过程称为变量的作用域提升(hoisting)。第二部分是在代码执行中,JavaScript 引擎会对变量进行赋值,并执行其他的函数。1.3. 全局代码的执行1.3.1. VO和GO的理解每一个执行上下文会关联一个VO(Variable Object,变量对象),变量和函数声明会被添加到这个VO对象中。变量对象是一个抽象的概念,在 JavaScript 引擎内部,它被实现为一个与当前执行上下文相关联的对象。在全局执行上下文中,变量对象是全局对象(Global Object); 在函数执行上下文中,变量对象是一个称为活动对象(Activation Object)的对象。当全局代码被执行的时候,VO就是GO对象了当全局代码被执行时,变量对象(Variable Object,简称 VO)就是全局对象(Global Object,简称 GO)了。全局对象是在 JavaScript 引擎内部创建的一个唯一对象,它在全局作用域下被访问,并且可以存储全局变量、函数、内置对象和浏览器提供的 API 等等。1.3.2. 全局代码执行过程(执行前)GO 对象在执行全局代码之前就已经被创建,并且包含了一些内置对象和方法,例如 Object、Array、String、Number、Math、JSON、setTimeout、setInterval 等等。当全局执行上下文被创建时,变量对象 VO 会被设置为 GO 对象,并且全局作用域下的变量和函数会被添加到变量对象中。1.3.3. 全局代码执行过程(执行后)代码执行后就会给变
RELATED

相关推荐

源码交付成选型刚需!终于告别厂商锁定陷阱

源码交付成选型刚需!终于告别厂商锁定陷阱

2026年,低代码行业迎来结构性洗牌拐点,企业选型逻辑彻底变天。 过去大家选低代码,只看能不能快速搭系统、有没有AI功能、模板多不多。而今年,源码交付能力超越智能化、功能数量,成为政企、中大型企业选型第一刚需。 根…

📅 2026/10/29 10:45:13
什么时候最划算?商标设计注册代理费每年都在涨吗?

什么时候最划算?商标设计注册代理费每年都在涨吗?

很多创业者都在纠结一个问题:“商标注册代理费是不是每年都在涨?我等到价格低的时候再办会不会更划算?”这个问题的答案涉及到官费和代理费两个完全不同的部分——一边是多年降价的“确定性”,另一边是正在涨价的“趋势”。官费&a…

📅 2026/10/29 11:17:01
179、Zephyr RTOS工业物联网项目实战:项目需求分析

179、Zephyr RTOS工业物联网项目实战:项目需求分析

Zephyr RTOS工业物联网项目实战:项目需求分析 昨晚调试一块STM32H743板子,串口打印突然卡死在k_sem_take里,看门狗复位后日志全丢了。翻遍代码才发现是某个线程在中断上下文里调了信号量——这种低级错误在Zephyr里会直接触发__ASSERT,但Release版默认关断言,于是系统静默…

📅 2026/10/30 14:20:08
MORE NEWS

更多资讯

📰

C++ PDF PoDoFo库使用教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

快速重装系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

C++自定义可对称双向迭代器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

C++ 列式内存布局数据存储格式 Arrow

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

C++ OPENGL 贝塞尔曲线绘制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

基于FPGA与STM32的LFM脉冲压缩雷达系统设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬