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.
当我运行下面的函数时,我在不同的浏览器上得到不同的结果:
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.