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