在使用 Roadhog
编译过程中,我的终端崩掉了,怀着好奇的心理,我找到了 JS Stack Trace
这样的提示,怎么理解呢,这节我们来探究一下。
本文并不会告诉你“终端崩溃了,如何解决?”,我只会围绕 “JS Stack Trace” 异常来分析,我们可能碰到了什么问题,以及需要了解的相关技术栈。
一、队列(Queue)与栈(Stack)
最早是在数据结构的线性表中接触到队列(Queue)与栈(Stack),我们先来回顾一下概念:
- 栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足 “FIFO:First In Last Out”;
- 队列只允许在表尾插入数据元素,在表头删除数据元素,满足 “First In First Out”。
这里我们不去纠结栈与队列的异同,而只去用概念去理解 JS 中 Stack。
二、Stack
我们先来看这样一段代码,试想一下输出结果,以及它是如何调用的:
1 |
function c() { |
对上面的代码做一下简短的分析:
- 当调用 a 的时候,它会被压到栈顶;
- 然后,当 b 在 a 中被调用的时候,它会被继续压入栈顶,当 c 在 b 中被调用的时候,也一样;
- 在运行 c 的时候,栈中包含了 a,b,c,并且其顺序也是 a,b,c;
- 当 c 调用完毕时,它会被从栈顶移出,随后控制流回到 b。当 b 执行完毕后也会从栈顶移出,控制流交还到 a。最后,当 a 执行完毕后也会从栈中移出。
每当有一个函数调用,就会将其压入栈顶。在调用结束的时候再将其从栈顶移出。
补充一点: 我们可以用 console.trace()
将 Stack Trace
打印到控制台。
三、Error
当 Error
发生的时候,通常会抛出一个 Error
对象。Error
对象也可以