什么是 JavaScript 调用栈,为什么它是必要的?

JavaScript 引擎是一个单线程解析器,而单线程解析器由堆和单一调用栈组成。浏览器提供 Web APIs,比如:DOM,AJAX 和 定时器。

本文旨在说明什么是调用堆栈以及为什么需要调用栈?对调用栈的理解有助于我们更加清晰的知道 函数的的层次结构和执行顺序 在 JavaScript 的引擎中工作方式。

调用堆栈主要用于函数调用,由于 调用堆栈是单个的,因此函数的执行从上到下一次性完成。这意味着调用栈是同步的。

对调用栈的理解对于异步编程至关重要,后面我们会介绍。

在异步 JavaScript 中,我们有一个回调函数,一个事件循环队列和一个任务执行队列。在事件循环将回调函数 推到堆栈之后,回调函数将在执行期间由调用堆栈执行。

在此之前,让我们尝试着回答什么是调用张?

在最基本的级别上,调用栈是一种数据结构,它使用后进先出(LIFO)原理临时存储 和管理函数调用。

让我们打破之前的定义:

LIFO:当我们说调用堆栈是按照后进先出的数据结构原理进行操作时,这意味着当函数返回时,被压入堆栈的最后一个函数是第一个弹出的函数。

让我们通过堆栈跟踪错误打印到控制台来掩饰 LIFO 的代码示例:

function firstFunction(){throw new Error('Stack Trace Error');
}function secondFunction(){firstFunction();
}function thirdFunction(){secondFunction();
}thirdFunction();

在浏览器控制台运行代码,我们会打印出此下错误信息,会打印出一个堆栈跟踪,说明如何将功能堆叠在一起,看一下该图:

你会注意到,函数作为堆栈的排序开始于 firstFunction() 这是进入堆栈的最后一个函数,并且以抛出错误弹出,然后就是 secondFunction(),然后就是 thirdFunction() 这是第一个函数在执行代码的时候将其压入堆栈。

临时存储

调用一个函数时,该函数,其参数和变量将被推入调用堆栈以形成堆栈框架,该堆栈是堆栈中的内存位置。当函数返回时(从栈弹出),将清除内存。

管理功能调用

调用堆栈回鹘每一个堆栈帧位置的记录。它知道下一个要执行的功能,并在执行后将其删除,这就是使得 JavaScript 中的代码执行顺序同步的原因。

调用堆栈如何处理函数调用?

我们将通过查看调用另一个函数的函数的示例代码来回答这个问题:

function firstFunction(){console.log("Hello from firstFunction");
}function secondFunction(){firstFunction();console.log("The end from secondFunction");
}secondFunction();

这是运行代码时发生的情况:

  1. secondFunction() 执行之后,将创建一个空的堆栈框架,它是程序的主要入口点
  2. secondFunction() 调用将 firstFunction() 推入堆栈
  3. firstFunction() 返回并在控制台输出 “Hello from firstFunction”
  4. firstFunction() 从堆栈弹出
  5. 然后将执行顺序移至 secondFunction()
  6. secondFunction() 返回并将 “secondFunction” 的信息打印至控制台
  7. secondFunction() 从堆栈弹出,清除内存。

是什么导致堆栈溢出?

当存在没有出口点的递归函数(调用自身的函数)时,将发生堆栈溢出。

看一个例子:

function callMyself() {callMyself()
}callMyself()

在浏览器执行之后,会爆出以下错误:

综上所诉

调用堆栈的主要收获是:

  1. 它是单线程的,每次只能做一件事情。
  2. 代码执行是同步的
  3. 函数调用会创建一个占用临时内存的堆栈
  4. 它的作用是 LIFO,先进后出

slf4j 如何返回堆栈_重学JS系列 - JS 调用堆栈相关推荐

  1. mysql支持的并发数_重学MySQL系列(五):谈谈对MySQL的存储引擎的理解

    原创作者,公众号[程序员读书],欢迎关注公众号,转载文章请注明出处哦. MySQL关于存储引擎的架构设计,相较于其他关系数据库管理系统,比如Oracle,SQL Server等数据库,这是MySQL最 ...

  2. mysql root用户可以同时几个人连接_重学MySQL系列(四):10分钟快速掌握MySQL用户与权限管理

    在这篇文章中,我们来聊聊怎么管理MySQL的用户及如何为不同用户分配不同的管理权限,其实,在日常使用MySQL的过程中,这部分的工作是由DBA(数据管理员)来完成的. 而我们作为一般的开发人员,只要拿 ...

  3. 重学JavaScript系列之一_引用类型

    重学JavaScript系列之一_引用类型 ECMAScript中,引用数据是一种数据结构,用于将数据和功能组织在一起,有时候被称为类 ES6中使用Class定义一个类 引用类型的值(对象)是引用类型 ...

  4. go 函数名之前括号中的内容_2020 重学 Go 系列:09. 一篇文章理解 Go 里的函数

    1. 关于函数 函数是基于功能或 逻辑进行封装的可复用的代码结构.将一段功能复杂.很长的一段代码封装成多个代码片段(即函数),有助于提高代码可读性和可维护性. 在 Go 语言中,函数可以分为两种: 带 ...

  5. c++ gdb 绑定源码_2020重学Go系列:30. 非常详细的 Go 语言 GDB 调试指南

    做为新手,熟练掌握一个好的调试工具,对于我们学习语言或者排查问题的时候,非常有帮助. 你如果使用 VS Code 或者 Goland ,可以直接上手,我就不再写这方面的文章了. 其实相比有用户界面的 ...

  6. 重学JavaScript系列——(四)变量、作用域与内存

    重学JavaScript系列--(四)变量.作用域与内存 博主以扎实JavaScript基础为目的,以<JavaScript高级程序设计(第四版)>为核心参考资料,以一个"复习者 ...

  7. 重学JavaScript系列——(六)集合引用类型

    重学JavaScript系列--(六)集合引用类型 博主以扎实JavaScript基础为目的,以<JavaScript高级程序设计(第四版)>为核心参考资料,以一个"复习者&qu ...

  8. 重学网络系列之(Ping与网关)

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 叨絮 网关,路由,其 ...

  9. 《重学Java系列》之 注解基础

    不诗意的女程序媛不是好厨师~ 转载请注明出处,From李诗雨-[https://blog.csdn.net/cjm2484836553/article/details/104432728] <重 ...

最新文章

  1. IP子网划分和vlsm(变长子网掩码)和路由汇总
  2. 【vs开发】向图形界面程序添加控制台
  3. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 重写 MetaClass#invokeMethod 方法实现函数拦截 | 实现函数调用转发 )
  4. 二叉树的基本概念以及基本操作
  5. 无监督学习 | 层次聚类 之凝聚聚类原理及Sklearn实现
  6. 微信qq一键登录php代码6,Laravel6实现第三方 微信登录
  7. 软件性能中几个主要的术语
  8. awk 输出到多个文件 多路输出
  9. 用户流失数据分析报告
  10. linux 查看网卡单双工,Linux 查看网卡全双工 还是半双工 以及设置网卡为半双工...
  11. 大学计算机基础教程第13章数据库技术基础
  12. 利用TODA进行ORACLE数据快捷导入导出
  13. 免费软件 Cmd GUI Shell(图形界面的命令提示符壳)-beta3
  14. 移动端vue调用照相机及相册
  15. (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码
  16. 静态IP与动态IP的区别
  17. 徐无忌深入JVM虚拟机笔记:Java代码到底是如何运行起来的?
  18. 设备唯一代码获取相关
  19. Scrapy图片自动下载配置
  20. WifiDisplay开启流程

热门文章

  1. 使用ilmerge实现.net程序静态链接
  2. How should I set up tag files for a multi-level directory hierarchy? kiss snow
  3. 关于对cross-browser支持的一些看法
  4. ACE源代码目录结构
  5. 修改meta标签 查看源码没效果怎么办_Spring 源码学习(三)-自定义标签
  6. linux mysql 数据目录迁移后不生效_Linux中更改转移mysql数据库目录的步骤
  7. redis 数据完整性
  8. Microsoft Sync Framework同步数据库 3:针对同步进行设置
  9. python之钉钉机器人编程
  10. centos 安装testlink出现:You don't have permission to access /testlink on this server