前端百题——通俗易懂的JavaScript执行上下文
JavaScript标准把一段代码(包括函数)执行所需的所有信息定义为“执行上下文”(可理解为当前代码的执行环境,同一个函数在不同的环境中执行,会因访问的数据不同产生不一样的结果),其是执行的基础设施。执行上下文包含的内容有很多,下面从类型、包含内容、生命周期、执行过程、结论来进行阐述。
10.1 类型
执行上下文主要分为三类:全局执行上下文、函数执行上下文、eval函数执行上下文。
- 全局执行上下文
当JavaScript执行全局代码的时候,会编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局执行上下文只有一份。
- 函数执行上下文
当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束之后,创建的函数执行上下文会被销毁。
- eval执行上下文
当使用eval函数的时候,eval代码也会被编译,并创建执行上下文。
10.2 包含内容
执行上下文在不同的版本中定义不同,《重学前端》中对此进行了总结,目前主要有三个版本:
- 执行上下文在ES3中,包含三个部分。
- scope:作用域,也常常被叫做作用域链。
- variable object:变量对象,用于存储变量的对象。
- this value:this值。
- 在ES5中,我们改进了命名方式,把执行上下文最初的三个部分改为下面这个样子。
- lexical environment:词法环境,当获取变量时使用。(通过let、const、with()、try-catch创建的变量存在词法环境中)
- variable environment:变量环境,当声明变量时使用。(通过var声明或function(){}声明的变量存在变量环境中)
- this value:this值。
- 在ES2018中,执行上下文又变成了这个样子,this值被归入lexical environment,但是增加了不少内容。
- lexical environment:词法环境,当获取变量或者this值时使用。
- variable environment:变量环境,当声明变量时使用
- code evaluation state:用于恢复代码执行位置。
- Function:执行的任务是函数时使用,表示正在被执行的函数。
- ScriptOrModule:执行的任务是脚本或者模块时使用,表示正在被执行的代码。
- Realm:使用的基础库和内置对象实例。
- Generator:仅生成器上下文有这个属性,表示当前生成器。
10.3 执行上下文生命周期
在执行上下文生命周期部分(将按照ES3阶段的内容进行介绍,因为自我感觉后续定义的名词内容虽然更全面,但背起来确实不是很容易),分为创建阶段和执行阶段两个阶段,每个阶段负责不同的事情。(注:,每一部分都是一个问题,详细解释看后续百题斩。)
- 创建阶段
创建阶段主要负责生成变量对象、建立作用域链以及确定this指向。
- 代码执行阶段
创建完成之后,就会开始执行代码,这个时候,会完成变量赋值,函数引用,以及执行其他代码。
10.4 代码执行过程
百题斩【008-009】介绍了代码和函数的执行过程,但是这个介绍只是从宏观方面进行介绍,并没有进行详细的介绍,下面将从调用栈这个角度详细阐述一下代码的执行过程。
-
创建 全局上下文 (global EC)。将其压入栈底;
-
全局执行上下文 (caller) 逐行 自上而下 执行。遇到函数时,函数执行上下文 (callee) 被push到执行栈顶层;
-
函数执行上下文被激活,成为 active EC, 开始执行函数中的代码,caller 被挂起;
-
函数执行完后,callee 被pop移除出执行栈,控制权交还全局上下文 (caller),继续执行;
下面将举一个例子来阐述该执行过程。
var a = 1; function f1() { // …… } function f2() { f1(); // …… } f2(); 复制代码
上述代码的调用栈如下所示:
- 首先创建全局执行上下文,并将全局执行上下文压入栈底;其中变量a、函数f1和f2都将被保存在全局执行上下文的变量环境中;
- 全局执行上下文开始执行,变量a被赋值为1,当调用函数f2是,会创建对应的函数执行上下文并压入调用栈,在函数f2的执行上下文被创建好后,将进入代码执行阶段;
- 函数f2执行过程中会调用函数f1,创建对应的函数执行上下文并压入调用栈;f1进行执行阶段;
- f1函数返回时,该函数的执行上下文从栈顶弹出;
- 紧接着f2函数返回,f2函数对应的执行上下文也从栈顶弹出;
- 至此代码执行关闭,当完毕页面的时候全局执行上下文销毁。
10.5 结论
了解了执行上下文,需要记住一些结论性的东西
-
在调用栈中只有栈顶的上下文处于执行中,其他上下文需要等待;
-
全局上下文只有唯一的一个,它在浏览器关闭时出栈;
-
函数的执行上下文的个数没有限制;
-
每次某个函数被调用,就会有个新的执行上下文为其创建,并把该执行上下文压入调用栈,然后JavaScript引擎开支执行函数代码,即使是调用的自身函数,也是如此;
-
当前函数执行完毕后,JavaScript引擎会将该函数的执行上下文弹出栈;
-
当分配的调用栈空间被占满时,会引发“堆栈溢出”问题。
看一看
1.如果觉得这篇文章还不错,来个分享、点赞吧,让更多的人也看到

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
社群编码识别黑灰产攻击实践
导读:所谓黑灰产,包含网络黑产、灰产两条产业链,随着互联网的飞速发展,网络黑灰产也在不断演变,当前网络黑灰产已经趋于平台化、专业化、精细化运作。基于黑灰产攻击特点,我们提出了一种基于社群编码的黑灰产攻击识别方法,社群发现部分基于图关系,编码部分引入大规模的图嵌入表示学习。相比于传统的图谱关系挖掘,可以更好的识别和度量未知攻击。而且我们还提出了基于异步准实时的工程化实现,对频繁变化的黑灰产攻击有更强的应变灵活性。 全文4424字,预计阅读时间12分钟。 一、背景 所谓黑灰产,包含网络黑产、灰色两条产业链,随着互联网的飞速发展,网络黑灰产也在不断发展,当前网络黑灰产已经形成了一个平台化、专业化、精细化,相互独立又紧密协作的产业链。从近几年多起重大网络安全事故看,黑灰产已经不再局限在半公开化的纯攻击模式,而是转化成为敛财工具和商业竞争的不良手段,据不完全统计,当前网络黑灰产的市场规模已经超过千亿元人民币,在这千亿级的市场规模下,发展出了非常多的细分领域,如木马病毒,养号刷单,薅羊毛,电信诈骗,知识盗版,流量劫持等。 各互联网平台为了防止被网络黑灰产攻击,开发了很多防御及识别技术,最常被广大用...
- 下一篇
京东 Vue3 组件库 nutui 3.0 发布,支持小程序开发
小程序多端适配 https://gitee.com/jd-platform-opensource/nutui 设计初衷 在跨端小程序的开发过程中,我们发现没有合适的组件库可以使用,尤其在做电商商城类场景的业务时,没有符合京东 App 规范的组件库为我们的小程序项目提供支持。为了填补这一空白,同时让 NutUI 组件库能够为更多的开发者带来便利,我们决定在 NutUI 3.0 中 增加小程序多端适配的能力。 如何适配 Taro 在小程序跨端开发中有着出众的表现,Taro 3x 在 2020年11月也宣布支持了 Vue3,所以我们可以采用 Taro + Vue 的技术栈来达到在小程序中适配多端的目的。 Taro 的特点可以如下: - 可以实现微信小程序原生代码转换到微信平台,百度平台等; - Taro 框架是唯一一款实现京东小程序适配的框架; - 支持 React/Vue 语法,更好地支持组件化和 TypeScript; - 行业影响力大,社区活跃,长期支持有保障; - 支持多端同步调试、能够适配主流小程序 若能将 Taro 的这些特点与能力添加到 NutUI 组件库中,实现彼此功能打通,...
相关文章
文章评论
共有0条评论来说两句吧...