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

本文深入探讨JavaScript的执行流程,详细解释了函数调用如何触发执行上下文的创建,以及JavaScript引擎如何利用调用栈管理这些执行上下文。通过具体示例,展示了全局上下文与函数调用上下文的交互过程。

JS执行流程&调用栈

栈和执行上下文

在这里插入图片描述

函数调用:

函数调用就是运行一个函数,具体使用方法是使用函数名称跟着一对小括号

var a = 2
function add(){
  var b = 10
  return a+b
}
add()

在执行到函数add()之前,javascript引擎为为上面的代码创建全局执行上下文,变量环境中包含了声明的函数和变量,参考下图:(具体的可以看上篇文章JS执行流程&变量提升
全局执行上下文
代码中的全局变量和函数都保存在全局上下文的变量环境中,然后开始执行全局代码add(),我们知道,这个是属于一个函数调用,因此会执行以下操作:

  • 全局执行上下文中,取出add函数代码
  • add函数的这段代码进行编译,并创建该函数的执行上下文可执行代码
  • 执行代码,输出

流程如下
在这里插入图片描述

从上面的代码执行流程,我们可以看出,在执行javascript代码的过程中可能会创建多个执行上下文,那么引擎是如何管理呢?
到这里,我们就要把一种叫栈的数据结构拿出来使用了,它就用来管理这些执行上下文

栈结构:

什么是栈:

栈的定义:

“栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。”

在这里插入图片描述
栈中的元素满足后进先出的特点

什么是javascript调用栈:

前面说到,javascript引擎是通过栈来管理多个执行上下文的,具体过程如下:

  • 创建好执行上下文
  • javascript引擎将执行上下文压入栈中

通常这种用来管理执行上下文的栈称为执行上下文栈,又称调用栈

了解了调用栈的含义,让我们来看一个例子

var a = 2
function add(a,b){
  return b+c
}
function addAll(b,c){
  var d = 10
  result = add(b,c)
  return a + result + d
}
addAll(3,6)

第一步:创建全局上下文,并压入栈底
在这里插入图片描述
可以看到,变量a,函数add(),addAll()都保存到了全局上下文变量环境对象中。
全局上下文被压入栈底之后,就开始执行全局代码了,首先var a = 2先被执行
在这里插入图片描述
第二步:接着执行addAll()函数,这是一个函数调用的情况,因此javascript引擎会为其创建一个执行上下文

如下图所示:
在这里插入图片描述
addAll()函数执行上下文创建好之后,就开始执行代码吗,先执行的是var d = 10
第三步:接着执行add()函数,这也是一个函数调用的情况,因此javascript引擎会为其创建一个执行上下文
在这里插入图片描述
当add()函数返回的时候,函数的执行上下文就会从栈顶弹出,并将result的值设置为add()函数的返回值9
在这里插入图片描述
之后addAll执行最后一个相加操作后返回,addAll的执行上下文也从栈顶部弹出
在这里插入图片描述
至此,整个javascript流程执行结束

 跨浏览器,可兼容IE7--IE10, FireFox, Chrome, Opera等几大内核的浏览器,且不需要浏览器再加装任何控件。  多系统兼容性、可移植性:由于只包括前台UI,因此二次开发者可很方便将本插件用在任何一种需要流程图的B/S系统应用上,流程图的详细实现逻辑完全交于后台程序开发者自己实现;对于后台,只要能返回/接收能被本插件解析的JSON格式数据即可.所以本插件可用于不同的服务器语言建立的后台上.  跨领域:流程图设计器不止用在电信领域,在其它需要IT进行技术支持的领域中都有重大作用.  以下从纯技术实现层面具体描述:  页面顶部栏、左边侧边栏均可自定义;  当左边的侧边栏设为不显示时,为只读状态,此时的视图区可当作是一个查看器而非编辑器。  侧边工具栏除了基本一些流程节点按钮外,还自定义新的节点按钮,自定义节点都可以有自有的图标、类型名称,定义后在使用可可在工作区内增加这些自定义节点。  顶部栏可显示流程图数据组的标题,也可提供一些常用操作按钮。  顶部栏的按钮,除了撤销、重做按钮外,其余按钮均可自定义点击事件。  可画直线、折线;折线还可以左右/上下移动其中段。  具有区域划分功能,能让用户更直观地了解哪些节点及其相互间的转换,是属于何种自定义区域内的。  具有标注功能,用橙红色标注某个结点或者转换线,一般用在展示流程进度时。  能直接双击结点、连线、分组区域中的文字进行编辑  在对结点、连线、分组区域的各种编辑操作,如新增/删除/修改名称/重设样式或大小/移动/标注时,均可捕捉到事件,并触发自定义事件,如果自定义事件执行的方法返回FALSE,则会阻止操作。  具有操作事务序列控制功能,在工作区内的各种有效操作都能记录到一个栈中,然后可以进行撤销(undo())或重做(redo()),像典型的C/S软件一样。  0.4版中,加入了只导出在初始载入后被编辑的流程图中,只作了增删改等变更的元素,这样可用于用户快速存储,只保存本次变更过的内容,不用重新保存整个流程。  0.5版中,结点的样式不再受到原有程序的限制,所有样式均默认为淡蓝色长方形;如果要指定为圆形,可在初始化时定义结点类型为”原有类型”+” round”;如果要指定为复合结点,则可在初始化时定义结点类型为”原有类型”+” mix”。”原有类型”+” myType”:myType可为自己写的一种特殊样式类.  0.6版中,修正了一些BUG,改善了用户操作体验,并增加在可编辑状态下时,能用键盘上DELETE按键对元素进行删除功能。  0.7版中,修正了一些BUG,增加了连线变更要连的起始结点或结束结点的功能。  0.8版,取消原来的拟物化页面,变成如今的扁平化页面,并且支持主要位置的颜色自定义功能(如果想沿用原来老版本中的拟物化页面,只需保留原来的GooFlow.css文件即可);修正0.7版中的画线BUG。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值