Error de tamaño máximo de pila de llamadas excedido

Estoy utilizando un archivo de la biblioteca JavaScript de Direct Web Remoting (DWR) y estoy recibiendo un error sólo en Safari (escritorio y iPad)

Dice

Se ha excedido el tamaño máximo de la pila de llamadas.

Qué significa exactamente este error y si se detiene el procesamiento por completo?

También cualquier arreglo para el navegador Safari (En realidad en el iPad Safari, dice

JS: la ejecución ha superado el tiempo de espera

que supongo que es el mismo problema de la pila de llamadas)

Solución

Significa que en algún lugar de tu código, estás llamando a una función que a su vez llama a otra función y así sucesivamente, hasta que llegas al límite de la pila de llamadas.

Esto es casi siempre debido a una función recursiva con un caso base que no se está cumpliendo.

Ver la pila

Considere este código...

(function a() {
    a();
})();

Aquí está la pila después de un puñado de llamadas...

Como puedes ver, la pila de llamadas crece hasta que alcanza un límite: el tamaño de la pila codificado por el navegador o el agotamiento de la memoria.

Para solucionarlo, asegúrate de que tu función recursiva tiene un caso base que se puede cumplir...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
Comentarios (16)

A veces puede ocurrir esto si accidentalmente se importa/incorpora el mismo archivo JavaScript dos veces, vale la pena comprobarlo en la pestaña de recursos del inspector.

Comentarios (6)

Hay un bucle recursivo en alguna parte de tu código (es decir, una función que finalmente se llama a sí misma una y otra vez hasta que la pila está llena).

Otros navegadores tienen pilas más grandes (por lo que se obtiene un tiempo de espera en su lugar) o se tragan el error por alguna razón (tal vez un try-catch mal colocado).

Utiliza el depurador para comprobar la pila de llamadas cuando se produce el error.

Comentarios (3)