为什么最大呼叫堆栈大小因样本而异?

时间:2019-01-06 02:43:52

标签: javascript callstack

如果我尝试

var count = 0

function recurse() {
  count++
  recurse()
}

try {
  recurse()
} catch(e) {
  console.log(e.message, count)
}

结果是Maximum call stack size exceeded 15662,但如果我尝试

var count = 0

function recurse() {
  count++
  ( new Function( recurse.toString().split('\n').splice(1, 2).join('\n') ) )()
}

try {
  recurse()
} catch(e) {
  console.log(e.message, count)
}

那么结果就是Maximum call stack size exceeded 8862

为什么数字不同?

3 个答案:

答案 0 :(得分:0)

啊,根据http://2ality.com/2014/04/call-stack-size.html

  

您可以进行的递归调用次数取决于两个数量:堆栈的大小和堆栈框架的大小(保留参数和局部变量)。

答案 1 :(得分:0)

因为堆栈不仅仅属于您的程序。

例如,当您的程序正在运行时,可以处理异步中断,或者可以通过调度程序挂起您的任务并将CPU切换到另一个任务。如果是这样,您的任务的当前上下文(寄存器,PSW)将保存在堆栈中,并在您重新获得控制权时恢复。

结果:堆栈消耗可以变化,并且堆栈指针(SP)下的所有值均未定义。而且,如果您保存的内容低于SP,而不是事实,您会读到相同的内容。

答案 2 :(得分:0)

因为在第一种情况下,每个递归函数调用的机器代码的大小较小。商(堆栈大小/堆栈上的函数调用大小)更大。

enter image description here