背景

如果你试图运行下面的代码:

function func(){func()
}func()

相信你会得到如下的结果

调用栈是用来管理函数调用关系的一种数据结构。让我们先来看看函数调用栈结构。


函数调用

函数调用就是运行一个函数,是以在函数名后加小括号的方式调用函数。在变量提升的文章中,我们已经了解到在函数运行前会创建执行上下文,并且在每一次函数被调用是都会创建一个执行上下文。所以当函数调用另一个函数时,会产生多个执行上下文。

GlobalExectionContext = {ThisBinding: <Global Object>,LexicalEnvironment: { ... },VariableEnvironment: { ... }
}FunctionExectionContext = {ThisBinding: <Global Object>,LexicalEnvironment: { ... },VariableEnvironment: { ... }
}FunctionExectionContext = {ThisBinding: <Global Object>,LexicalEnvironment: { ... },VariableEnvironment: { ... }
}...

此时JavaScript引擎就需要使用一种数据结构来管理这些执行上下文


栈是一种线性的有序的数据集合,它的添加和删除操作只允许在集合的尾部进行,所以它具有先进后出的特点。

由于入栈和出栈操作在同一端处理,如果不停的入栈而不出栈的话,整个集合就会出现被占满的情况。


JavaScript调用栈

JavaScript引擎利用了这种数据结构来管理执行上下文的。函数被调用时向调用栈压入函数执行上下文,函数运行结束时函数执行上下文被弹出。所以文章开头的那段代码会形成如下的调用栈。

只有入栈而没有出栈,直到调用栈中的执行上下文达到最大数量,就会报错结束。

在开发过程中,利用浏览器控制台工具可以很好的观察JavaScript调用栈的信息,帮助我们更好的调试程序。 我们在之前的代码中加入断点。

运行第一次。

跳过一次断点后,可以明显的看出调用栈的变化。


总结

  • JavaScript调用栈使用栈数据结构管理着执行上下文。执行上下文随着函数的调用而入栈,随着运行结束而出栈。
  • 调用栈满时会报错。
  • 当需要使用递归时,可考虑使用迭代替换以减少执行上下文的数量。

当我们在实际开发中,势必会使用很多第三方库或框架,当发生报错时可利用控制台的调用栈工具快速定位问题。

对于开发者工具的使用,后面会有单独的章节讲解。

只调用一次_JavaScript运行机制 - 调用栈相关推荐

  1. 运行指定代码_JavaScript 运行机制(Event Loop)详解

    一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...

  2. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

  3. Java中complex怎么被调用_java中存在三种调用机制

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制 ...

  4. python调用.so动态链接库,运行时报错 liblapack.so.3: undefined symbol: icamin_k

    目录 1. 报错 2. 原因 3. 尝试 4. 解决 1. 报错 用python调用动态链接库,编译完全没有问题,顺利生成.so文件,但是运行python调用该库时,发生报错. 报错信息如下: Tra ...

  5. 【Spring Cloud】OpenFeign和Spring Cloud Loadbalancer调用失败后的重试机制比较

    1 概述 搭建一个微服务系统,有两个服务,Client和Server,Server有三个实例A.B.C,我让Client调用Server,Loadbalancer负载分担默认采用轮询机制,当Serve ...

  6. php获取python运行结果_“如何实现在PHP中调用Python并获取运行结果“

    如何实现在PHP中调用Python并获取运行结果 Python的import包件功能就跟PHP的include类似更确切的说应该更像是PHP中的require,因为Python里的import只要目就 ...

  7. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

  8. C#如何调用以管理员身份运行的cmd命令提示符

    windows自从vista.win7.win8/8.1以来,命令行提示符分为两种模式,一种是普通用户模式,一种的管理员模式,很多情况下,我们的程序需要在命令提示符(管理员身份)的状况下运行,但是c# ...

  9. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

最新文章

  1. 页面嵌套除了iframe还能用什么方法_CTF|有关CSP绕过的方法
  2. CSS中Float概念相关文章
  3. 根据参数显示类别(三级联动,需要JSON数据)
  4. linux 下Python调用C模块
  5. keras concatenate_Keras结合Keras后端搭建个性化神经网络模型
  6. delphi libeay32 各版本_Zbrush各版本合集
  7. CCIE试验备考之交换security(2)
  8. raise event when save - COM_PR_CHBADI_RAISE_WF_EVENT
  9. android删除打开方式,Android 打开方式选定后默认了改不回来?解决方法(三星s7为例)...
  10. spark.sql读取Hive数据报错
  11. kickstart模式实现批量安装centos7.x系统
  12. Linux下SVN搭建与配置
  13. 异常总结2013-04
  14. 慢慢人生路,学点Jakarta基础-集合类
  15. linux内核源码分析plat-form 分析
  16. 2021全球Top 1000计算机科学家h指数发布,中国53人上榜!Bengio总榜第二,韩家炜居华人首位...
  17. 【期末划重点】高数下期末考复习
  18. 了解局域网和广域网的概念差异
  19. linux测试上行带宽,linux服务器上传下载带宽测试
  20. SpringSecurity认证基本原理与认证2种方式

热门文章

  1. 为何从单体架构迁移到微服务这么难?
  2. 如何用 Java 实现简单的区块链
  3. Java 8中的时间日期库DateTime API及示例
  4. java如何实现连接wifi_java-是否可以检测到您要连接的WiFi类型?
  5. JAVA静态方法是否可以被继承 6,JAVA静态方法是否可以被继承?
  6. mnn 编译转换工具 win10 2021
  7. python sqlalchemy操作SQLite
  8. Multiple Object Tracking:多目标跟踪综述
  9. pytorch 测试 darknet
  10. raspberry pi 3B 树莓派 安装tensorflow