什么是JavaScript 调用栈?

原文链接:https://note.noxussj.top/?source=helloworld


什么是调用栈?

我们写的 JS 代码大多数都是同步模式,也就是从上往下依次执行。后一个任务必须要等前一个任务结束才能开始执行,程序的执行顺序和我们代码的编写顺序是完全一致的。程序执行中每遇到一个任务都会先入栈,当前入栈的任务执行完毕后就会出栈。本来栈的概念是留到数据结构算法在讲的,但是这里用到了可以提前介绍一下。

什么是栈?

栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底,操作栈的元素时,只能从栈顶操作(添加、移除、取值)。

下面通过代码的例子和调试工具去更好的理解栈和 JS 调用栈。

1console.log('global begin') 2 3function bar() { 4 console.log('bar task') 5} 6 7function foo() { 8 console.log('foo task') 9 10 bar() 11} 12 13foo() 14 15console.log('global end')

执行顺序如下

  1. JS 引擎会将整个 script 的代码提取到一个匿名函数(anonymous)中,并且压入调用栈(也就是入栈)开始逐行执行
  2. 首先是第一行 global begin,压入调用栈

img

  1. 执行 global begin 在控制台打印完毕后,出栈

img

  1. 接下来就遇到了函数的声明 bar 和 foo ,只有代码的调用才会入栈,声明是不会的
  2. 遇到了 foo 函数的调用,压入调用栈

img

  1. 执行 foo 函数,foo 函数第一行是 foo task 压入调用栈

img

  1. 执行 foo task (控制台打印) 完成后,往下就是调用了 bar 函数,将 bar 函数压入调用栈

img

  1. 在 bar 函数执行过程中将 bar task 入栈

img

  1. 执行 bar task (控制台打印)完后,也代表我们的 bar 函数执行完成,bar 函数执行完成也代表 foo 函数执行完成,将它们依次出栈。最后 global end 也压入调用栈

  2. 最后将 global end 入栈,执行完毕后出栈。整个匿名函数(anonymous)也执行完成

img

在浏览器调试工具右侧可以看到调用栈:

img

点赞
收藏

评论区

加载中...

相关推荐

什么是JavaScript异步模式

什么是异步模式?不会等待当前任务执行完毕,才会去执行下一个任务,这就是异步模式(Asynchronous)。开启异步后,就会跳过本任务,开始执行下一个任务,后续的逻辑一般会通过回调函数的方式定义。异步模式执行中,涉及到调用栈(Callstack)、消息队列

java运行时数据区

运行时数据区包括以下几个部分:程序计数器,堆,java栈,本地方法栈,方法区1.程序计数器:当CPU需要执行指令时,需要从程序计数器中获取当前需要执行的指令所在存储单元的地址。用来指示执行哪条指令。其大小不会随程序的执行而发生改变。2.Java栈:java方法执行的内存模型。存放的时一个个栈帧,每个栈帧对应一个被调用的方法。  栈帧中包括:局

什么是JavaScript同步模式?

原文链接:什么是同步模式?大部分单线程任务都会排队执行任务,这就称为同步模式(Synchronous)。同步模式执行中,只涉及到调用栈(Callstack)。现实生活举例就像验核酸一样,我们要排队一个个去验(按顺序排队),当只有一条通道(也就是单线程)时,

什么是 JavaScript 单线程?

原文链接:什么是JavaScript单线程?单线程是指当存在多个任务时候,所有任务都必须排队并且按照顺序执行。这里就会有同学问为什么不是多线程?假设是多线程,同时执行一些任务,某个任务进行了该dom的修改,而某个任务进行了该dom的删除,这样就会出现一些问

什么是宏任务与微任务?

原文链接:事件循环机制在事件循环中,每进行一次循环操作称为tick,每一次tick的任务处理是比较复杂的。关键步骤如下:1.执行一个宏任务2.执行过程中如果遇到微任务,就将它添加到微任务的任务队列中3.宏任务执行完毕后,立即执行当前微任务队列中的所有微任务

Activity启动模式

当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode""设置。1\.Standard模式(默认)我们平时直接创建的Activity都是这种模式的