JS底层原理之调用栈

先回顾一下计算机中的两个重要原理,栈和队列

栈(Stack), 栈的特点就是先进后出,可以想象成一个竖置的瓶子,先入栈的会进入到最底部,所以出来的时候只能排在最后的位置

队列(Queue), 队列的特点就是先进先出,可以想象成一个管子,管子两侧分别对应进入和离开, 所以先进来的也会第一个出来。

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

简单举例

function getSum(x, y) {
    return x+ y;
}
function findavg(x,y) {
    return getSum(x,y) / 2;
}
let z = findAvg(10, 20);

从脚本开始执行起

  1. js创建全局上下文global()函数,添加到调用栈的顶部
  2. 函数声明不会放入调用栈,先指向findavg函数,findAvg入栈
  3. findavg中有调用getSum函数,getSum入栈
  4. getSum函数执行完毕,getSum出栈
  5. findAvg函数执行完毕,findAvg出栈

调用栈溢出

调用栈溢出是指当前调用栈没有剩余空间了,通常是发生在递归函数没有明确的结束条件时,因此会抛出调用栈超出执行范围的异常

调用栈调试

在源代码(source)这里我们可以通过添加断点来查看当前函数执行的调用栈等信息,从而帮助我们更快速的解决问题


Posted

in

by

Tags: