如果我尝试
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
。
为什么数字不同?
答案 0 :(得分:0)
啊,根据http://2ality.com/2014/04/call-stack-size.html,
您可以进行的递归调用次数取决于两个数量:堆栈的大小和堆栈框架的大小(保留参数和局部变量)。
答案 1 :(得分:0)
因为堆栈不仅仅属于您的程序。
例如,当您的程序正在运行时,可以处理异步中断,或者可以通过调度程序挂起您的任务并将CPU切换到另一个任务。如果是这样,您的任务的当前上下文(寄存器,PSW)将保存在堆栈中,并在您重新获得控制权时恢复。
结果:堆栈消耗可以变化,并且堆栈指针(SP)下的所有值均未定义。而且,如果您保存的内容低于SP,而不是事实,您会读到相同的内容。
答案 2 :(得分:0)