JavaScript执行上下文之调用栈和多执行上下文(二)

Ubuntu升级遇到grub-efi-amd64-signed报错?3步搞定这个烦人的EFI目录问题 本文详细解析了Ubuntu系统升级时遇到的“grub-efi-amd64-signed”报错及“cannot find EFI directory”问题。通过剖析UEFI启动机制与EFI系统分区原理,提供了从诊断到修复的三步解决方案,帮助用户快速解决因EFI目录未挂载导致的升级中断,确保系统引导正常。 阅读详情

在上一篇文章中我们讨论了有关执行上下文,它是编译阶段创建的第一个执行上下文。

我们称这个第一个执行上下文为全局执行上下文(global EC),这个执行上下文存储的相关变量是全局变量。

全局执行上下文并不是唯一的,当脚本运行时,多个执行上下文可以被创建或移出。

那么这些执行上下文来自哪?

一个执行上下文与编译阶段联系在一起,那么多个执行上下文暗示有多个编译阶段。

这个机制与函数有关

上面的代码中,我们知道在程序运行结束后控制台会打印20,但是在执行上下文里到底发生了什么?

一如既往,从编译开始,首先创建一个全局执行上下文

在变量环境中,我们可以看见“apple”,“appleTotal”变量和“total”函数,编译结束,并且执行开始。

“apple”变量的值被更新为10,然后js引擎阅读“total()”部分

在此刻,同样两个步骤被重复。编译阶段开始,但是这个时候,它仅仅发生在total函数

js引擎创建一个新的执行上下文,total函数的执行上下文,并且将它堆叠在全局执行上下文的顶部,我们称这个结构为栈。

栈有一个特点:后进,先出。这也是我们在这个机制中唯一关心的特点。

与全局执行上下文相同,一个变量环境存在与total函数执行上下文中,里面一个值为undefined的“price”变量

接下来,total函数的执行上下文开始执行阶段,“price”变量的值被更新为2

然后,这个函数在total执行上下文找到“price”变量,在全局执行上下文找到“apple”变量。

很好,它找到了所有变量并计算出结果返回

在同一时刻,这个返回值在全局执行上下文中被赋值给“appleTotal”变量。

接下来total执行上下文中没有可执行的脚本了,所以js引擎将它从栈中移出。

total执行上下文是最后一个进栈的,所以它是第一个离开栈的。

现在,栈底还有最后一个执行上下文,全局执行上下文。

仅仅保留的可执行脚本是在控制台打印appleTotal的值,这个做完后,整个程序运行完成。

从这个例子中,我们可以看到js引擎如何管理执行栈。

  • js引擎在一个函数被调用之前不会编译这个函数里的代码
  • 当一个函数被编译,一个新的执行上下文被创建,并且被放置到栈顶
  • 所有的执行上下文被管理在一个栈结构中,这个过程发生从栈顶到栈底
  • 任何时候一个函数被调用,都会发生编译和执行两个步骤

根据执行上下文在栈顶相互堆叠,我们称之为调用栈。

在浏览器中检擦你的js调用栈

当代浏览器,在它的开发工具中很容易检查它的调用栈

以chrome为例

为了检查调用栈,我们需要:

  • 一个HTML文件
  • 一个断点

HTML文件的代码如下,当然,你也可以给出自己的代码

<script>
var apple = 10;
function total() {
 var price = 2;
 return apple * price;
}
var appleTotal = total();
console.log(appleTotal);
</script>

在chrome中运行这个HTMl文件,并且在开发者工具中打开source面板

在source面板上,我们在total函数里打一个断点

接下来刷新页面,调用栈将会展示出来。那个total是total函数的执行上下文,并且“anonymous”是全局执行上下文。

结论:

  • 多个执行上下文是被管理在一个栈结构中,被称为js调用栈。
  • js引擎重复两个步骤过程,编译和执行,为了添加和移除执行上下文。
  • 新的执行上下文被添加到栈的最上面,最上面的执行上下文优先完成执行。
  • 仅仅只有一个全局执行上下文,并且它总是在栈的底部,它在浏览器开发工具中展示为“anonymous”(匿名)调用栈。

 

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程) 本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。 阅读详情

相关推荐

Avalonia跨平台开发入门:从安装到运行第一个应用(Windows/Linux/macOS)

本文详细介绍了Avalonia跨平台开发的基础入门指南,从安装到运行第一个应用的全过程。涵盖Windows、LinuxmacOS三大平台的环境配置,特别推荐使用Visual Studio进行开发,并提供常见问题的解决方案,帮助开发者快速上手Avalonia框架。

weixin_28688385的博客 507

不知道你知不知道的执行上下文执行

js的执行顺序我们都知道是从上到下进行执行了,而且都知道js执行前会进行预编译。 预编译的时候,先一行一行的去解析代码,找到var等声明变量。进行预处理。在找到匿名函数进行解析,再去一行行的去执行。 这里就能有我们经常遇到的变量提升,看下面的代码。 console.log(a); //哈哈 var a = '哈哈'; 这里就发生了变量提升。 好像说跑题了奥。我们回到执行上下文执行上下文 我知道大家都知道执行上下文有三种; 1.全局执行上下文。 全局的都知道,在执行js的时候就会存在全局执行上下文

weixin_44655037的博客 257

DeepSeek赋能公文写作指南(一)

DeepSeek 的出现,为公文写作领域带来了新的曙光。作为先进的人工智能技术,DeepSeek 以其强大的语言理解与生成能力,能为公文写作提供全方位的支持。它可以快速梳理思路,提供丰富的素材参考,辅助优化语言表达,甚至能根据不同的公文类型场景,生成极具价值的内容框架。《DeepSeek 赋能公文写作指南》正是基于此背景应运而生。本书旨在帮助公文写作者深入了解并充分利用 DeepSeek 这一强大工具,将其融入到公文写作的各个流程中。

oubin1991的博客 5381

【js执行上下文

执行上下文是指 JavaScript 代码被编译执行时所在的环境,也可以称之为执行环境; JavaScript 中运行任何的代码都是在执行上下文中运行的。 执行上下文:在 ES3、ES5 中都有不同的规定。所以也就流传了种解释。 其中 ES3 的解释流传最广(《JavaScript 高级程序设计》中使用了这种解释)。 虽然这几种解释不太一样,但是无论哪一种,只要能搞明白,对我们 JS 的学习都会有很大的帮助。准确来说,执行上下文有三种类型,分别是:全局执行上下文、函数执行上下文、函数执行上下文。 但是由

m0_59966946的博客 791

您准备好观看GraphQL了吗?

在上一篇文章中,我们讨论了GraphQL与REST相比的优势。 在本文中,我们将看到GraphQL的实际应用。 我创建了一个示例应用程序来展示RESTGraphQL之间的差异。 首先,我们将看到简单产品详细信息终点的REST实现。 我已经使用Spring Boot演示REST。 下载示例项目,并按照README中概述的步骤设置项目。 我不在这里讨论设置细节,因为它超出了本文的范围。 假设您...

最佳 Java 编程 183

平衡叉树(AVL Tree) | 删除操作

我们在上一篇文章中讨论了 AVL 插入。在这篇文章中,我们将采用类似的方法实现删除操作。删除步骤:为了确保给定的树在每次删除后保持 AVL,我们必须增加标准 BST 删除操作以执行一些重新平衡,插入操作类似我们根据不同的情况进行以平衡叉树。设 w 为要删除的节点对 w 执行标准 的BST删除操作。从 w 开始,向上移动并找到第一个不平衡节点。令 z 为第一个不平衡节点,y 为 z 的高度较大的子节点,x 为 y 的高度较大的子节点。注意 x y 的定义与之前的插入操作不同。......

嗅探网的博客 968

红黑树(Red-Black Tree)- 插入操作

目录在上一篇文章中,我们讨论了红黑树的介绍。在这篇文章中,将讨论插入。在AVL 树插入中,我们使用旋转作为工具在插入后进行平衡。在红黑树中,我们使用两个工具来进行平衡。重新着色是节点颜色的变化,即如果它是红色的,则将其更改为黑色,反之亦然。必须注意的是,NULL 节点的颜色始终为黑色。此外,我们总是先尝试重新着色,如果重新着色不起作用,那么我们就进行轮换。下面是详细的算法。根据叔叔的颜色,算法主要有两种情况。如果叔叔(父节点的兄弟节点)是红色的,我们会重新着色。如果叔叔是黑色,我们会进行旋转/或重新着色。

嗅探网的博客 654

JavaScript执行机制——调用栈

为什么JavaScript代码会出现栈溢出?什么是函数调用什么是栈什么是 JavaScript调用栈在开发中,如何利用好调用栈如何利用浏览器查看调用栈的信息栈溢出(Stack Overflow)总结 JavaScript 引擎先会对其进行编译,并创建执行上下文。但是并没有明确说明到底什么样的代码才算符合规范。 那么接下来我们就来明确下,哪些情况下代码才算是“一段”代码,才会在执行之前就进行编译并创建执行上下文。一般说来,有这么三种情况: 当 JavaScript 执行全局代码的时候,会编译全局代码并创

前端探险家的博客 1957

什么是JavaScript执行上下文调用栈

什么是JavaScript执行上下文调用栈 作为一名JavaScript开发者,我们有必要比了解JavaScript语言的内部执行机制,执行上下文调用栈JavaScript中的关键概念之一,理解了执行上下文调用栈更加有助于让我们了解JavaScript中的变量提升、作用域、闭包等其他概念。 前面的两篇关于作用域的文章: 函数作用域全局作用域 什么是JavaScript作用域、作用域链? 块级作用域暂时性死区 ES6的块级作用域暂时性死区是什么? 执行上下文调用栈 不要被高大上的名词所吓倒,其

小帅的编程笔记 868

JavaScript】什么是执行上下文?什么是调用栈

点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文I hate hearing something that absolu...

程序员小乐 1394

js代码执行过程、调用栈执行上下文

针对变量提升来说,我们知道在编译阶段会将变量、函数提升并存放于执行上下文的变量环境对象中,在执行阶段通过在调用栈管理的一个个上下文环境的变量环境对象中查找目标变量/函数。当函数执行时,会将函数最外层通过let、const声明的变量,并且不处于块级作用域内的变量,进行变量提升,初始化为undefined,然后压入栈底。在编译阶段,javascript引擎将变量的声明部分函数的声明部分提升到代码开头,并且给被提升的变量设置默认值:undefined,同时这些被提升的变量将被放入到变量环境对象中。

foreverzwl 1709

深入JavaScript之JS引擎如何执行JS代码

我们大概经常能听到“执行环境”、“作用域”、“原型(链)”、“执行上下文”等内容,它们都在描述什么? JS代码的运行 我们知道了js是弱类型语言,在运行时才确定变量类型。js引擎在执行js代码时,也会从上到下进行 词法分析、语法分析、语义分析 等处理,并在代码解析完成后生成AST(抽象语法树),最终根据AST生成CPU可以执行的机器码并执行。 除此之外,JS引擎在执行代码时还会进行其它处理,如 V8 中还有两个阶段: 编译阶段:该阶段会进行执行上下文的创建,包括创建变量对象、建立作用域链、确定 this

flying meng的菜鸟居 5342

【js面试】JavaScript执行执行上下文是什么?

理解执行执行上下文对于掌握JavaScript的运行机制至关重要。执行栈负责管理函数的调用顺序,而执行上下文则提供了代码执行所需的环境信息。通过掌握这两个概念,开发者可以更有效地调试代码、优化性能,并避免常见的错误。second();first();创建全局上下文请压入执行栈first函数被调用,创建函数执行上下文并压入栈执行first函数过程遇到second函数,再创建一个函数执行上下文并压入栈second。

1676

【图解】JS执行流程&调用栈

JS执行流程&调用栈执行上下文 函数调用: 函数调用就是运行一个函数,具体使用方法是使用函数名称跟着一对小括号 var a = 2 function add(){ var b = 10 return a+b } add()执行到函数add()之前,javascript引擎为为上面的代码创建全局执行上下文,变量环境中包含了声明的函数变量,参考下图:(具体的可以看上篇文章JS执行流程&变量提升) 代码中的全局变量函数都保存在全局上下文的变量环境中,然后开始执行

金金的博客 1369

JavaScript执行机制——调用栈,前端开发面经分享

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等。

m0_60452134的博客 912

33-js-concepts调用栈机制:深入理解JavaScript执行上下文与堆栈管理

在日常的JavaScript开发中,你是否曾经遇到过这样的困惑: - 为什么函数调用顺序会影响代码执行结果? - 递归函数为什么会引发"Maximum call stack size exceeded"错误? - 异步代码同步代码的执行顺序究竟如何确定? 这些问题的答案都隐藏在JavaScript调用栈机制中。作为JavaScript开发者,深入理解调用栈不仅是掌握语言核心机制的关键,更是写...

gitblog_00409的博客 709

JavaScript执行机制——调用栈(1)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!

2401_84153262的博客 1005

读书笔记|JavaScript中的调用栈:全局执行上下文函数执行上下文

每调用一个函数,JavaScript引擎就会为其创建执行上下文,并把该执行上下文压入调用栈中,然后JavaScript引擎开始执行函数代码。如果在一个函数A中调用了另一个函数B,那么JavaScript引擎会为B函数创建执行上下文,并将B函数的执行上下文压入栈顶。当前函数执行完毕后,JavaScript引擎就会将该函数的执行上下文弹出栈。

wxc237786026的专栏 437

JS调用栈

当一段代码被执行时,JS引擎先会对其进行编译,并创建执行上下文 ----接上篇JS变量提升 JS变量提升已经讲了编译执行。但没有明确什么才叫 一段代码 以下情况代码才算是“一段”代码,才会在执行之前就进行编译并创建执行上下文 当JS执行全局代码的时候,会编译全局代码并创建全局执行上下文,而且在整个页面的生存周期内,全局执行上下文只有一份。 当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束之后,创建的函数执行上下文会被销毁。 当使用eval函数的时候,e

qq_44767749的博客 2086

Dify OA 公文排版助手示例(可导入应用 + 测试用例)

基于 Dify 的公文排版示例应用,自动标题编号、摘要与关键词生成,并输出要素信息,附带可验证测试用例与导入说明。

Windows 11 手动下载安装配置 uv 0.8.15、配置国内源(附赠绿色安装包).zip

本资源包含在 Windows 11 上安装 uv、配置国内源的教程(PDF 文件),附赠 uv-x86_64-pc-windows-msvc.zip (版本:0.8.15)。

上一篇: JavaScript执行上下文-从编译到执行(一)
下一篇: JavaScript执行上下文之词法环境和块级作用域(三)
feral_coder
博客等级 码龄9年 19粉丝 80原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值