Javascript 调用堆栈的用途是什么?

Javascript 调用堆栈的用途是什么?,javascript,Javascript,我在学习JS时遇到了术语“调用堆栈”。我发现它有助于跟踪调用的函数,但不幸的是,我看不到它的真正好处,即调用堆栈帮助我们解决了哪些问题,以及它在开发过程中给我们带来了哪些实际好处。对于这两个问题,我无法找到答案,因此决定在平台上提问。 调用堆栈是解释器(如JavaScript)的一种机制 (web浏览器中的解释器),以跟踪其在脚本中的位置 调用多个函数-当前正在运行哪个函数 以及从该函数中调用哪些函数,等等 例如,在每次迭代中执行递归函数时,我们可以看到调用堆栈有什么: function pow

我在学习JS时遇到了术语“调用堆栈”。我发现它有助于跟踪调用的函数,但不幸的是,我看不到它的真正好处,即调用堆栈帮助我们解决了哪些问题,以及它在开发过程中给我们带来了哪些实际好处。对于这两个问题,我无法找到答案,因此决定在平台上提问。

调用堆栈是解释器(如JavaScript)的一种机制 (web浏览器中的解释器),以跟踪其在脚本中的位置 调用多个函数-当前正在运行哪个函数 以及从该函数中调用哪些函数,等等

例如,在每次迭代中执行递归函数时,我们可以看到调用堆栈有什么:

function pow(x, n) {
  return (n == 1) ? x : (x * pow(x, n - 1));
}

pow(2, 4)
最大递归深度受JavaScript引擎的限制。通常情况下,对于大多数人来说,100000可能超出了限制。因此,如果调用
pow(21000)
,我们可以抛出错误:

超过最大调用堆栈大小

另一个例子:

const sum=(a,b)=>{
返回a+b;
}
常数mult=(a,b)=>{
返回a*b;
}
常数除法=(a,b)=>{
返回a+b;
}
常量减法=(a,b)=>{
返回a+b;
}
总和(1,2);
mult(1,2);
分割(4,2);
减法(4,2)A是程序用来跟踪其所在位置的东西。假设您有以下代码:

firstMethod();
函数firstMethod(){
第二种方法();
第三种方法();
}
函数secondMethod(){
//我什么也不做
}
函数第三种方法(){
第四种方法();
}
函数第四种方法(){
//我也什么都不做
}
伪调用堆栈的行为类似于此(请记住,这是一个大大简化的过程,并且只有一个抽象的表示来向您展示它是如何工作的):

  • 第一种方法()
    firstMethod
    将调用
    secondMethod
    ,因此调用堆栈(调用
    secondMethod
    时)如下所示:

  • 第一种方法()
  • 第二种方法()
  • 然后,
    secondMethod
    完成执行,程序返回调用堆栈:

  • 第一种方法()
  • firstMethod
    现在调用另一个函数,
    thirdMethod
    。此调用后,调用堆栈将如下所示:

  • 第一种方法()
  • 第三种方法()
  • thirdMethod
    将调用
    fourthMethod
    ,因此程序不会返回到
    firstMethod
    ,而是将
    fourthMethod
    添加到调用堆栈中:

  • 第一种方法()
  • 第三种方法()
  • 第四种方法()
  • fourthMethod
    完成执行后,程序将返回调用堆栈并完成遇到的所有方法的执行:

  • 第一种方法()
  • 第三种方法()
  • thirdMethod
    也完成了执行,程序返回调用堆栈:

  • 第一种方法()

  • 当调用堆栈第一个条目中的所有代码都已执行时,程序将完成执行。

    进程的内存分为堆栈和堆两部分。当使用
    malloc
    显式分配内存时,将使用堆。通过调用函数隐式分配内存时,将使用堆栈。函数参数和局部变量被推送到堆栈上。当控制流离开函数时,变量将从堆栈中移除。当一个函数调用另一个函数时,第二个函数的变量被推到第一个函数的变量之上。这导致了一个非常长的变量堆栈,称为调用堆栈。每个函数调用都会在堆栈上推送新变量


    这是一篇关于堆栈的著名论文:

    调用堆栈几乎用于所有语言,而不仅仅是JS。当你调用一个函数时,它会记住返回时要返回的函数。这与开发无关,只是计算机跟踪它们所做的事情的方式。@wewq提供了很好的解释。这并不是说维基百科也没有完整的文章…@Barmar当然它与开发有关,因为计算机跟踪他们正在做什么的方式是由程序员开发的。计算机不能自己做任何事情。