Quiero saber cómo funciona la pila de llamadas después de que aparece una.
Por ejemplo:
function inner() { console.log("what happens after inner() pops at Call Stack?"); } function outer() { inner(); console.log("how can Call Stack returned to this line?"); } outer();Puedo decir eso en Call Stack:
outer() , TOP of Call Stack ---------------- outer() // not executed. so lets begin at line 1! ---------------- BOTTOM of Call Stackinner() en la primera línea de outside() y lo empujamos a Call Stack,entonces tenemos
TOP of Call Stack ---------------- inner() // not executed yet! outer() // line 1 is on… ---------------- BOTTOM of Call Stackconsole.log de inner() , inner() finaliza,inner() ,entonces tenemos
TOP of Call Stack ---------------- outer() // line 1 is executed. let's continue with line 2! ---------------- BOTTOM of Call Stack Pero, ¿CÓMO SABE LA PILA DE LLAMADAS DÓNDE CONTINUAR cuando regresan al outer() ? ¿Cómo puede outer() en la parte superior de la pila no reiniciarse en la primera línea? ¿Recuerdan algunas cosas como el puntero (que señala la línea de función externa)? pero en donde? ¿Qué pasa si la función recursiva sucede como 100 veces, entonces cuando tenemos 100 pilas, donde recuerdan todas las posiciones donde continuar?
Gracias por su ayuda.
La pila de llamadas no solo almacena la función a la que regresar, sino también la ubicación particular dentro de esa función.
También almacena los valores de las variables locales dentro de la función. Esto es esencial para que las funciones recursivas funcionen correctamente.
Tenga en cuenta que todo esto es un detalle de implementación de la VM de JavaScript y podría implementarse de varias maneras. Por ejemplo, la ubicación de retorno podría ser una dirección de memoria después de compilar JIT el JavaScript en código de máquina. O la función podría estar en línea, sin dejar ningún marco de pila.