Recursion - стек вызовов не срабатывает при тестировании максимального размера стека

В основном стек вызовов начинает вызывать вызовы функций один за другим, когда возвращается вызов функции last-in. Но когда я пытаюсь создать стек вызовов ближе к размеру его максимума, появляется An uncaught expression.

//Code for testing the stack size
var cnt = 0;

function test(){
 //Max stack size is nearer to ~41800
 if(cnt++ == 41763){
  console.log('finished');
  return true;
 }
 return test();
}

test();

Таким образом, приведенный выше код генерирует исключение для меня в хром версии 49.0.2623.112 м, как показано ниже,

Неподготовленное исключение

< правда

Пожалуйста, не забывайте, что указанная ошибка не содержит сообщений. Мой вопрос здесь,

Последний вызов функции в стеке возвратил true, что означает, что размер стека не был превышен. почему другая функция не вызвала этот стек, не была возвращена? И в чем причина этого чистого сообщения об исключении?

Ответы

Ответ 1

Проблема здесь

console.log('finished');

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

Попробуйте запустить его без console.log, и вы увидите, что вы достигли предела и видите либо истинное, либо исключение.

Ответ 2

Консоль .log не специфицирует javascript, поэтому поведение undefined и может быть изменено с версии на выпуск. Так что что-то, что происходит в вашей версии, возможно, не происходит в нашей.

Вот наиболее вероятное объяснение того, что произошло: уверен, что console.log увеличит размер стека, и поскольку это последнее выражение, которое вы вызываете перед возвратом, иногда может вызывать Maximum call stack, потому что вы очень близко к пределу. Этот Максимальный вызов может произойти внутри кода console.log(который вызывает что-то еще), и как эта ошибка будет обрабатывать его, это зависит от кода console.log. Кажется, что код внутри console.log выдает исключение Uncaught при возникновении ошибки. Теперь, когда вы обнаруживаете ошибку при попытке, код продолжает, что появляется истина.

Вот пример в jsfiddle, где я переопределяю console.log, и результаты отображаются в HTML. Вы можете играть, удалив переопределяющий код console.log, чтобы посмотреть, как все меняется. Попробуйте это и сообщите нам, если результат кажется странным снова.

Стоит заметить, что при появлении ошибки Maximum call stack size exceeded это зависит и от размера фрейма стека (локальные переменные).

Примечание. В ECMAScript 6 spec, если вызов функции является последним действием в функции, он не будет в стеке, но он будет запускаться "немедленно", поэтому ваш код будет работать без ошибок для всех номеров, независимо от того, сколько вы положили.