当我运行下面的函数时,在不同的浏览器上会得到不同的结果:
function maxCallStackSize0() {
try {
return 1 + maxCallStackSize0();
} catch (e) {
return 1;
}
}
maxCallStackSize0(); // Opera: 32354, Chrome: 12795
但这还不是全部。如果我多次手动运行,结果也会改变:
maxCallStackSize0(); // Opera: 34724
maxCallStackSize0(); // Opera: 33776
maxCallStackSize0(); // Opera: 34030
是不是因为在后台调用了其他函数而占用了一些堆栈?
我还看到我传递的参数越多,调用堆栈越小:
function maxCallStackSize3(s1, s2, s3, s4) {
try {
return 1 + maxCallStackSize3(s1, s2, s3, s4);
} catch (e) {
return 1;
}
}
maxCallStackSize3("hello", "how", "are", "you"); // Opera: 13979, Chrome: 6971
是因为参数是调用栈的一部分,并且我传递的参数越多/大小越大,则调用栈在溢出之前可以越短?
是否可以知道调用堆栈的最大大小(以字节为单位)?
谢谢
答案 0 :(得分:1)
此处的堆栈大小取决于多个因素。
首先,当您调用函数时,所有参数和一个返回地址都被压入堆栈。同样,您将在函数内定义的所有局部变量也会在堆栈上。
第二,堆栈在与堆相反的方向上增长。一个进程将一个内存空间用于堆栈和堆。如果堆上有变量(例如,如果您使用new
实例化一个变量,它将在堆上而不是堆栈上创建)。堆上的空间越多,堆栈增长的空间就越少。
我不知道您的设置如何,但是如果浏览器选项卡中正在运行其他任何内容,那将干扰堆栈大小,因为它将占用一些空间。