Javascript: почему максимальный размер стека изменяется динамически? - PullRequest
0 голосов
/ 20 февраля 2019

Когда я запускаю функцию ниже, я получаю разные результаты в разных браузерах:

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 голосов
/ 20 февраля 2019

Размер стека здесь зависит от нескольких вещей.

Во-первых, когда вы вызываете функцию, все параметры и адрес возврата помещаются в стек.Также все локальные переменные, которые вы определили бы внутри функции, были бы в стеке.

Во-вторых, стек растет в направлении, противоположном куче.Процесс использует одно пространство памяти для стека и кучи.Если у вас есть переменные в куче (например, если вы создаете экземпляр переменной с new, она будет создана в куче, а не в стеке).Чем больше в куче, тем меньше места для стека.

Я не знаю, как выглядит ваша установка, но если в вашей вкладке браузера будет запущено что-то еще, то это повлияет на размер стека, поскольку займет некоторое пространство.

...