文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

前端百题斩——通俗易懂的JavaScript执行上下文

2024-12-03 04:38

关注

 JavaScript标准把一段代码(包括函数)执行所需的所有信息定义为“执行上下文”(可理解为当前代码的执行环境,同一个函数在不同的环境中执行,会因访问的数据不同产生不一样的结果),其是执行的基础设施。执行上下文包含的内容有很多,下面从类型、包含内容、生命周期、执行过程、结论来进行阐述。

10.1 类型

执行上下文主要分为三类:全局执行上下文、函数执行上下文、eval函数执行上下文。

全局执行上下文

当JavaScript执行全局代码的时候,会编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局执行上下文只有一份。

函数执行上下文

当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束之后,创建的函数执行上下文会被销毁。

eval执行上下文

当使用eval函数的时候,eval代码也会被编译,并创建执行上下文。

10.2 包含内容

执行上下文在不同的版本中定义不同,《重学前端》中对此进行了总结,目前主要有三个版本:

执行上下文在ES3中,包含三个部分。

在ES5中,我们改进了命名方式,把执行上下文最初的三个部分改为下面这个样子。

在ES2018中,执行上下文又变成了这个样子,this值被归入lexical environment,但是增加了不少内容。

10.3 执行上下文生命周期

在执行上下文生命周期部分(将按照ES3阶段的内容进行介绍,因为自我感觉后续定义的名词内容虽然更全面,但背起来确实不是很容易),分为创建阶段和执行阶段两个阶段,每个阶段负责不同的事情。(注:,每一部分都是一个问题,详细解释看后续百题斩。)

创建阶段

创建阶段主要负责生成变量对象、建立作用域链以及确定this指向。

代码执行阶段

创建完成之后,就会开始执行代码,这个时候,会完成变量赋值,函数引用,以及执行其他代码。

10.4 代码执行过程

百题斩【008-009】介绍了代码和函数的执行过程,但是这个介绍只是从宏观方面进行介绍,并没有进行详细的介绍,下面将从调用栈这个角度详细阐述一下代码的执行过程。

  1. 创建 全局上下文 (global EC)。将其压入栈底;
  2. 全局执行上下文 (caller) 逐行 自上而下 执行。遇到函数时,函数执行上下文 (callee) 被push到执行栈顶层;
  3. 函数执行上下文被激活,成为 active EC, 开始执行函数中的代码,caller 被挂起;
  4. 函数执行完后,callee 被pop移除出执行栈,控制权交还全局上下文 (caller),继续执行;

下面将举一个例子来阐述该执行过程。

  1. var a = 1; 
  2. function f1() { 
  3.     // …… 
  4.  
  5. function f2() { 
  6.     f1(); 
  7.     // …… 
  8.  
  9. f2(); 

上述代码的调用栈如下所示:

  1. 首先创建全局执行上下文,并将全局执行上下文压入栈底;其中变量a、函数f1和f2都将被保存在全局执行上下文的变量环境中;
  2. 全局执行上下文开始执行,变量a被赋值为1,当调用函数f2时,会创建对应的函数执行上下文并压入调用栈,在函数f2的执行上下文被创建好后,将进入代码执行阶段;
  3. 函数f2执行过程中会调用函数f1,创建对应的函数执行上下文并压入调用栈;f1进行执行阶段;
  4. f1函数返回时,该函数的执行上下文从栈顶弹出;
  5. 紧接着f2函数返回,f2函数对应的执行上下文也从栈顶弹出;
  6. 至此代码执行关闭,当完毕页面的时候全局执行上下文销毁。

10.5 结论

了解了执行上下文,需要记住一些结论性的东西

  1. 在调用栈中只有栈顶的上下文处于执行中,其他上下文需要等待;
  2. 全局上下文只有唯一的一个,它在浏览器关闭时出栈;
  3. 函数的执行上下文的个数没有限制;
  4. 每次某个函数被调用,就会有个新的执行上下文为其创建,并把该执行上下文压入调用栈,然后JavaScript引擎开支执行函数代码,即使是调用的自身函数,也是如此;
  5. 当前函数执行完毕后,JavaScript引擎会将该函数的执行上下文弹出栈;
  6. 当分配的调用栈空间被占满时,会引发“堆栈溢出”问题。

本文转载自微信公众号「执鸢者」,可以通过以下二维码关注。转载本文请联系执鸢者公众号。

 

来源:执鸢者内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯