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

信道估计之MMSE算法 信道估计之MMSE算法前言MMSE估计的原理总结 前言        前篇分析了LS信道估计算法,也说明了由于没有考虑SNR的影响,所以LS算法不适合在低信噪比的情况下使用。本篇来学习信道估计的另外一种常用的算法–MMSE。        为什么说LS没有考虑噪声大小的情况呢,因为LS算法使用的是实际观测量与估计观测量的误差,这并不能精确的代表估计量的真值与估计值的误 阅读详情

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

我们称这个第一个执行上下文为全局执行上下文(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”(匿名)调用栈。

 

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集 阅读详情

相关推荐

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

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

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

weixin_44655037的博客 259

openMVS ---dense point cloud(代码理解)

openMVS ---dense point cloud(代码理解)0 代码实现原理1 代码实现步骤1.1 参数传递1.2 loading .mvs数据1.3 稠密重建1.3.0 相关变量及概念1.3.1 ComputeDepthMaps(data) --计算多张深度图1.3.1.1. pre1.3.1.2 为每一张depth map Select view(s) !!!1.3.1.2.1 N neighbors --- global score + filter1.3.1.2.2 MRF ---- t

小rivaaaa的博客 5328

【js执行上下文】

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

m0_59966946的博客 966

win11系统ping另一台电脑上VMware虚拟机的IP

我是用了两台电脑,所以刚才遇到一个问题就是两台电脑的IP 在同一局域网内ping不通。于是就找了很多资料,经过坚强的绝望后终于解决了。 下开始解决问题: VMWare提供了三种工作模式:bridged(桥接模式)、NAT(网络地址转换模式)和host-only(主机模式)。 1. bridged(桥接模式)   在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚

qq_42817360的博客 3238

苏州大学自动化考研842自动控制原理:手把手教你用胡寿松《自控》高效备考(附复试电工/电子/微机原理攻略)

本文详细解析苏州大学自动化考研842自动控制原理备考策略,以胡寿松《自动控制原理》为核心教材,提供三阶段高效学习路径和实战技巧。重点涵盖频域分析、根轨迹绘制等高频考点,并针对机电、光电、轨道三个学院的复试科目(电工电子技术、电子技术基础、微机原理与接口技术)给出差异化备考方案,助力考生全面提升笔试和面试表现。

weixin_42638178的博客 399

您准备好观看GraphQL了吗?

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

最佳 Java 编程 183

Obsidian与GPT协作:数学公式从KaTeX到MathJax的无缝转换实践

本文针对Obsidian用户从GPT等AI助手复制数学公式时遇到的KaTeX与MathJax格式不兼容问题,提供了高效的解决方案。重点介绍了KaTeX to MathJax插件的核心作用,它能自动将AI生成的KaTeX格式公式(如\(...\))无缝转换为Obsidian默认支持的MathJax格式($...$),实现复制粘贴后公式即时渲染,极大提升了数学笔记与AI协作的效率和流畅度。

weixin_29209825的博客 136

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

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

嗅探网的博客 970

Unreal5从入门到精通 专栏目录

欢迎来到“UE5从入门到精通”专栏!在这里,我们将带您踏上一段精彩的旅程,深入探索虚幻引擎5(Unreal Engine 5)的无限可能。不论您是游戏开发的新手,还是希望提升技能的开发者,这里都有适合您的内容。基础知识:了解虚幻引擎5的界面、功能和基本操作,为您的学习打下坚实的基础。项目实战:通过实际项目案例,帮助您从理论走向实践,真实体验游戏开发的每个环节。高级技巧:分享各种高级功能和技巧,包括蓝图、C++编程、材质编辑、光照和渲染等,让您能够创作出更具专业水准的作品。

TxNet 2987

【OCPP】ocpp1.6J协议框架说明

本文档的目的是为读者提供创建正确的可互操作 OCPP JSON 实现 (OCPP-J) 所需的信息。我们将根据我们自己的经验,尝试解释什么是强制性的、什么是良好做法以及什么是不应该做的。毫无疑问,误解或歧义仍然存在,但我们旨在通过本文件尽可能地防止它们。IANA:互联网数字分配机构(OCPP-J:使用JSON通过WebSocket进行OCPP通信。特定的OCPP版本应使用J扩展进行指示。OCPP1.5J表示我们正在讨论1.5版本的JSON/WebSocket实现。

qq_53871375的博客 1240

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

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

嗅探网的博客 658

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1729

JavaScript的执行机制——调用栈

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

前端探险家的博客 1961

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

小帅的编程笔记 870

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

程序员小乐 1397

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

foreverzwl 1716

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

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

1692

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

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

金金的博客 1375

JS调用栈

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

qq_44767749的博客 2093

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

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

wxc237786026的专栏 440

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

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

gitblog_00409的博客 710

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

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

m0_60452134的博客 916

JS调用栈:为何会栈溢出

了解什么是JavaScript的调用栈,从而知道为何会出现栈溢出,才能知道如何在代码中尽量避免栈溢出

weixin_43443341的博客 1172

JavaScript执行上下文和调用栈

如果函数是作为普通函数调用的,那么"this"引用的是全局对象(在浏览器中是"window"对象,在Node.js中是"global"对象)。总之,"this"关键字在JavaScript中用于引用当前执行代码的上下文对象,它的值取决于函数的调用方式以及函数所属的对象。在全局作用域中,"this"引用的是全局对象(在浏览器中是"window"对象,在Node.js中是"global"对象)。声明的变量和声明的函数在全局中使用,所以在顶级代码中就被执行,但是函数内的代码,只有在被调用的时候菜会执行!

分享学习网络的点点滴滴 213

深入理解JavaScript——执行上下文与调用栈

在说一个概念前,我们需要确定它的前提,此文以 ECMAScript5 为基础撰写执行上下文可以理解为函数的执行环境,当函数执行时,都会创建一个执行环境每次只能有一个执行上下文处于运行状态,因为 JavaScript 是单线程语言,它由执行栈或(叫)调用栈来管理创建一个函数,就生成了一个作用域;调用一个函数,就生成一个作用域链执行上下文创建阶段分为绑定 this,创建词法环境,变量环境三步调用函数时,创建一个新的词法环境。

小陈的博客 1055
上一篇: JavaScript执行上下文-从编译到执行(一)
下一篇: JavaScript执行上下文之词法环境和块级作用域(三)
feral_coder
博客等级 码龄9年 19粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值