【问题标题】:Why does the maximum call stack size differ from sample to sample?为什么最大调用堆栈大小因样本而异?
【发布时间】:2019-01-06 02:43:51
【问题描述】:

如果我尝试

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。

为什么数字不同?

【问题讨论】:

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

标签: javascript callstack


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      因为堆栈不属于你的程序。

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

      结果:堆栈消耗可以变化,堆栈指针 (SP) 以下的所有值都是未定义的。如果你保存低于 SP 的东西,而不是事实,你会读到同样的东西。

      【讨论】:

        猜你喜欢
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 2022-06-24
        • 1970-01-01
        • 2017-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多