Saltar al contenido

"RangeError: se excedió el tamaño máximo de la pila de llamadas" ¿Por qué?

Deseamos mostrarte la mejor respuesta que hemos encontrado por todo internet. Deseamos que te sea de ayuda y si deseas compartir alguna mejora hazlo libremente.

Solución:

Los navegadores no pueden manejar tantos argumentos. Vea este fragmento, por ejemplo:

alert.apply(window, new Array(1000000000));

Esto produce RangeError: Maximum call stack size exceeded que es el mismo que en tu problema.

Para resolver eso, haz lo siguiente:

var arr = [];
for(var i = 0; i < 1000000; i++)
    arr.push(Math.random());

Aquí falla en Array.apply(null, new Array(1000000)) y no el .map llamar.

Todos los argumentos de las funciones deben caber en la pila de llamadas (al menos los punteros de cada argumento), por lo que en esto hay demasiados argumentos para la pila de llamadas.

Necesita comprender qué es la pila de llamadas.

Stack es una estructura de datos LIFO, que es como una array que solo admite métodos push y pop.

Déjame explicarte cómo funciona con un ejemplo simple:

function a(var1, var2) 
    var3 = 3;
    b(5, 6);
    c(var1, var2);

function b(var5, var6) 
    c(7, 8);

function c(var7, var8) 

Cuando aqui funcion a se llama, llamará b y c. Cuándo b y c se llaman, las variables locales de a no son accesibles allí debido a los roles de alcance de Javascript, pero el motor de Javascript debe recordar las variables y argumentos locales, por lo que los empujará a la pila de llamadas. Digamos que está implementando un motor JavaScript con el lenguaje Javascript como Narcissus.

Implementamos el callStack como array:

var callStack = [];

Cada vez que se llama a una función, empujamos las variables locales a la pila:

callStack.push(currentLocalVaraibles);

Una vez que finaliza la llamada a la función (como en a, hemos llamado b, b se termina de ejecutar y debemos volver a a), recuperamos las variables locales haciendo estallar la pila:

currentLocalVaraibles = callStack.pop();

Entonces cuando en a queremos llamar c nuevamente, inserte las variables locales en la pila. Ahora, como saben, los compiladores para ser eficientes definen algunos límites. Aquí cuando estás haciendo Array.apply(null, new Array(1000000)), tu currentLocalVariables el objeto será enorme porque tendrá 1000000 variables en el interior. Ya que .apply pasará cada uno de los dados array elemento como argumento de la función. Una vez empujado a la pila de llamadas, esto excederá el límite de memoria de la pila de llamadas y arrojará ese error.

El mismo error ocurre en la recursividad infinita (function a() a() ) ya que demasiadas veces, se han enviado cosas a la pila de llamadas.

Tenga en cuenta que no soy un ingeniero de compilación y esto es solo una representación simplificada de lo que está sucediendo. Realmente es más complejo que esto. Generalmente, lo que se envía a la pila de llamadas se llama marco de pila que contiene los argumentos, las variables locales y la dirección de la función.

Primero debe comprender la pila de llamadas. Comprender la pila de llamadas también le dará claridad sobre cómo funciona la "jerarquía de funciones y el orden de ejecución" en el motor de JavaScript.

La pila de llamadas se utiliza principalmente para la invocación de funciones (llamada). Dado que solo hay una pila de llamadas. Por lo tanto, todas las funciones se ejecutan y se abren una a la vez, de arriba a abajo.

Significa que la pila de llamadas es síncrona. Cuando ingresa una función, se inserta una entrada para esa función en la pila de llamadas y cuando sale de la función, esa misma entrada se extrae de la pila de llamadas. Entonces, básicamente, si todo está funcionando sin problemas, al principio y al final, la pila de llamadas se encontrará vacía.

Aquí está la ilustración de la pila de llamadas:
ingrese la descripción de la imagen aquí

Ahora, si proporciona demasiados argumentos o se encuentra dentro de una llamada recursiva no controlada. Te encontrarás

RangeError: se excedió el tamaño máximo de la pila de llamadas

lo cual es bastante obvio como lo explicaron otros.
ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Espero que esto ayude !

Comentarios y calificaciones del artículo

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.