Javascript: 为什么最大堆栈大小似乎是动态变化的?

Javascript: Why does the maximum stack size appear to change dynamically?

当我运行下面的函数时,我在不同的浏览器上得到不同的结果:

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

是不是因为参数是调用栈的一部分,而且我传递的参数 more/the 越大,调用栈在溢出之前越短?

是否可以知道以字节为单位的调用堆栈的最大大小?

谢谢

堆栈大小取决于多种因素。

首先,当你调用一个函数时,所有的参数和一个return地址被压入堆栈。此外,您将在函数中定义的所有局部变量都将在堆栈上。

其次,栈的增长方向与堆相反。一个进程使用一个内存 space 用于堆栈和堆。如果您在堆上有变量(例如,如果您使用 new 实例化一个变量,它将在堆上创建,而不是在堆栈上创建)。堆上越多,堆栈增长的空间就越小。

我不知道你的设置是什么样的,但如果你的浏览器选项卡中还有其他东西 运行 会影响堆栈大小,因为它会占用一些 space.