Você está curioso sobre quantas chamadas recursivas podem ser feitas pelo mecanismo JavaScript?
Quantas chamadas recursivas
A função a seguir permite encontrar a resposta: (inspirado na essência de Ben Alman)
A cópia do código é a seguinte:
função computemaxCallStackSize () {
tentar {
return 1 + ComputemaxCallStackSize ();
} catch (e) {
// Ligue para pilha de transbordamento
retornar 1;
}
}
Três resultados:
A cópia do código é a seguinte:
Node.js: 11034
Firefox: 50994
Chrome: 10402
O que esses números representam? Aleph apontou que, no V8, o número de chamadas recursivas depende de duas quantidades: o tamanho da pilha e o tamanho do quadro da pilha (a variável local que mantém os parâmetros). Você pode verificar se adicionando variáveis locais no ComputemaxCallStackSize () - ele retorna um valor baixo.
Otimização de chamadas de cauda no ECMAScript 6
O ES6 tem otimização de chamadas de cauda: se a última etapa de uma função também for uma chamada de função, ela será "saltada" em vez de ser chamada por uma subfunção. Isso significa que no ES6 (modo rigoroso), você só precisa alterar um pouco a função ComputemaxCallStackSize e pode ser executada para sempre.
A cópia do código é a seguinte:
função computemaxCallStackSize (size) {
tamanho = tamanho || 1;
retornar computemaxCallStackSize (tamanho + 1);
}