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

时间:2019-02-20 16:18:27

标签: javascript stack-overflow

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

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

是因为参数是调用栈的一部分,并且我传递的参数越多/大小越大,则调用栈在溢出之前可以越短?

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

谢谢

1 个答案:

答案 0 :(得分:1)

此处的堆栈大小取决于多个因素。

首先,当您调用函数时,所有参数和一个返回地址都被压入堆栈。同样,您将在函数内定义的所有局部变量也会在堆栈上。

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

我不知道您的设置如何,但是如果浏览器选项卡中正在运行其他任何内容,那将干扰堆栈大小,因为它将占用一些空间。