原文地址

调用栈

调用栈是解释器追踪函数执行流的一种机制。当执行环境中调用了多个函数函数时,通过这种机制,我们能够追踪到哪个函数正在执行,执行的函数体中又调用了哪个函数。

我们知道JavaScript是一种解释性的脚本语言,浏览器在运行JS脚本时按照顺序从上往下逐行解释。

  • 当运行到一个函数时,解释器就将该函数添加到栈顶并执行;
  • 当调用栈中执行的函数还调用了其他函数,那么新函数也将会被添加到调用栈,一旦这个函数被调用,便会立即执行;
  • 当前函数执行完毕后,解释器将其清出调用栈,继续执行当前执行环境下的剩余代码;
  • 当分配的调用栈空间被占满时,会引发“堆栈溢出”;

下面看一个例子来了解调用栈:

function multiply(x, y) {
return x * y;
} function printSquare(x) {
...
var s = multiply(x, x);
console.log(s);
} printSquare(5);

当执行上述代码时,调用栈的变化如下:

  1. 把printSquare()添加到调用栈;
  2. 执行把printSquare函数,代码执行到multiply()时,把multiply()添加到调用栈;
  3. multiply函数执行完,将他从调用栈移出;
  4. 执行console.log方法,并把该方法添加到调用栈
  5. 删除调用栈中的console.log方法
  6. printSquare执行完毕,删除调用栈中的printSquare



    一开始,我们得到一个空空如也的调用栈。随后,每当有函数被调用都会自动地添加进调用栈,执行完函数体中的代码后,调用栈又会自动地移除这个函数。最后,我们又得到了一个空空如也的调用栈。
  • 异常追踪

    调用栈有一个很重要的应用就是异常追踪,当异常发生的时候,通过调用栈能够追踪到异常发生的位置。
function foo() {
throw new Error('SessionStack will help you resolve crashes :)');
}
function bar() {
foo();
}
function start() {
bar();
}
start();

JS调用栈的一些总结的更多相关文章

  1. js 调用栈机制与ES6尾调用优化介绍

    调用栈的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用栈的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础 ...

  2. JS理论:调用栈、事件循环、消息队列(也叫任务队和回调队列)、作业队列(微任务队列)

    一:调用栈是个什么鬼东西,它具有栈的属性--后进先出 先看一段简单的JS代码: const second = function(){ console.log('hello there'); } con ...

  3. Flask Vue.js全栈开发

    Flask Vue.js全栈开发的 最新完整代码 及使用方式 本系列的最新代码及使用方式将持续更新到: http://www.madmalls.com/blog/post/latest-code/ 1 ...

  4. Node.js最新技术栈之Promise篇

    前言 大家好,我是桑世龙,github和cnodejs上的i5ting,目前在天津创业,公司目前使用技术主要是nodejs,算所谓的MEAN(mongodb + express + angular + ...

  5. JavaScript js调用堆栈(三)

    本文主要深入介绍JavaScript内存机制 内存模型 JS内存空间分为栈(stack),堆(heap),池(一般也会归类为栈中),其中栈存放变量,堆存放复杂对象,池存放常量. 注:闭包中的变量并不保 ...

  6. 详解JavaScript调用栈、尾递归和手动优化

    调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...

  7. JavaScript是如何工作的:引擎,运行时间以及调用栈的概述

    JavaScript是如何工作的:引擎,运行时以及调用栈的概述 原文:How JavaScript works: an overview of the engine, the runtime, and ...

  8. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  9. 如何通过JS调用某段SQL语句

    如何通过JS调用某段SQL语句,这样的需求在报表.数据平台开发中很常见.以报表平台FineReport开发为例,例如在点击某个按钮之后,来判断一下数据库条数,再决定下一步操作.那这在后台如何实现呢? ...

随机推荐

  1. MySql数据库中的datediff函数

    MySql数据库中的datediff函数:主要是用来返回两个日期之间相隔的天数   一半情况下是大日期在前,小日期在后的 这样写也是能够运行的 要注意查询结果:

  2. MongoDB数据操作练习

    1.创建一年级的3个班,并随机添加 10 名学生: >for(grade_index in (grade = ['grade_1_1', 'grade_1_2', 'grade_1_3'])) ...

  3. 编写一个方法去掉数组里面重复的内容 var arr=['abc','abcd','sss','2','d','t','2','ss','f','22','d'];

    function noRepeat(arr) { var arr1 = []; for (var i = 0; i < arr.length; i++) { var item = arr[i]; ...

  4. 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall题解

    题目 二分图最大匹配问题 cow数组标现在牛栏里的牛是几号牛 每次寻找都要清空vis数组 如果可行有两种情况 1.这个牛栏里没有牛 2.这个牛栏里的牛可以到别的牛栏去 根据此递归即可 Code: #i ...

  5. 洛谷P1578 奶牛牧场(悬线法思想)

    题目 悬线法的思想--即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界. 如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值. 考虑如何 ...

  6. px转rem vue vscode

    1.vscode中安装px2rem 2.打开settings.json ,新增  "px2rem.rootFontSize": 75, 3.重启vscode 4.可以转换了

  7. Redis读写分离技术解析

    背景 云数据库Redis版不管主从版还是集群规格,replica作为备库不对外提供服务,只有在发生HA的时候,replica提升为master后才承担读写流量.这种架构读写请求都在master上完成, ...

  8. kafka shell

    停止 ./bin/kafka-server-stop.sh  启动 nohup sh kafka-server-start.sh ../config/server.properties & 创 ...

  9. SQL和PL/SQL的区别

    SQL和PL/SQL的区别 1. SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一 ...

  10. 了解编程语言 ----- c# 简介

    1.编程语言 编程语言: 为了实现人与机器的交互,计算机主要识别的就是 0 和 1 语言的发展过程主要分为: 1.面向机器的语言:二进制,汇编 2.面向过程的语言:汇编语言,C语言,B语言, 3.基于 ...