Call Stack
Es el lugar a donde van a parar todas las funciones que llamemos y las que estas mismas llamen, todo en un orden correspondiente. El motor de Javascript solamente cuenta con una sola pila de llamadas, por lo que no puede hacer varias cosas al mismo tiempo.
Por ejemplo, cuando desde un script llamamos a una función, el intérprete va a añadirla a la pila e iniciará su ejecución. Toda función que sea llamada desde esta, va a ser agregada por encima de ella en la pila y será ejecutada inmediatamente. Cuando se termine de ejecutar la última función llamada, se eliminará de la pila y reanudará la ejecución de la función anterior.
Cada elemento en la pila de ejecución es distinto de otro, teniendo cada uno su propio contexto de ejecución y variables locales (Aunque sean varios elementos del mismo nombre).
Nuestra pila por lo general tiene un límite de capacidad, por lo que si nos excedemos se producirá un error llamado “desbordamiento de pila” (Overflowing).
function foo(){
foo();
}
foo();
Este ejemplo lo saqué de la documentación de MDN y nos dice básicamente esto:
function saludar(){
dihola(){
console.log('Hola');
}
}
function diHola() {
saludar();
}
//Invocación
saludar();
- Se registra línea por línea nuestro script.
- Una vez llega a la línea de cuando invocamos a la función
saludar()
, el intérprete la agrega a la pila de llamadas.
PILA DE LLAMADAS
saludar
(Ejecutando)
- Comienza la ejecución de cada línea de código que contenga dicha función hasta que se tope con una nueva llamada a otra función.
- Llega a la invocación de
diHola()
. - Añade la función
diHola()
a la pila de llamadas.
PILA DE LLAMADAS
diHola
(Ejecutando)saludar
- Ejecuta todas las líneas que contenga la función
diHola()
hasta el final. - Una vez terminada la ejecución de
diHola()
esta es borrada de la pila.
PILA DE LLAMADAS
saludar
(Ejecutando)
- Se vuelve a retomar la ejecución de la función
saludar()
desde el punto en que se quedó hasta el final. - Una vez terminada la ejecución de
saludar()
se elimina de la pila.
PILA DE LLAMADAS
- vacío
LIFO Last In First Out: nos dice que, el último en entrar es el primero en salir.
Stack trace
En caso de que tengamos un error en el Call Stack, se nos informará mediante el Stack trace.
Este nos muestra la misma información que teníamos hasta ese momento en el Call Stack y como se fueron llamando cada función hasta la línea en que surgió el error. Se lee de abajo para arriba.