Cada entrada suele representarse como un stack frame o frame de llamada.
Un frame mantiene la información necesaria para esa llamada, por ejemplo:
Sus parámetros y variables locales.
El punto al que debe regresar.
El contexto de ejecución asociado.
Información útil para rastrear errores.
No necesitas imaginar que toda la información del lenguaje vive literalmente dentro de una pequeña caja. Es un modelo para comprender cómo se organizan las llamadas activas.
Cuando ocurre un error, JavaScript puede mostrar la cadena de llamadas activa.
JavaScript
functionvalidateUser(user){if(!user){thrownewError("User is required");}}functioncreateOrder(user){validateUser(user);}functionsubmitOrder(){createOrder(null);}submitOrder();
El stack trace puede mostrar una ruta similar a:
Texto
validateUser
createOrder
submitOrder
Se lee desde el lugar donde ocurrió el error hacia las funciones que condujeron hasta allí.
Estos nombres suelen aparecer juntos, pero representan ideas diferentes.
De forma simplificada:
El Call Stack organiza llamadas activas y datos necesarios para ejecutarlas.
El Heap es una región de memoria utilizada para estructuras dinámicas como objetos y funciones.
JavaScript
functioncreateUser(){const user ={name:"Nicolás",};return user;}
El binding local user forma parte del entorno de la llamada. El objeto puede almacenarse en memoria dinámica y continuar existiendo después de que la función termina porque fue retornado.
No conviene convertir “primitivos en stack y objetos en heap” en una regla absoluta del lenguaje. Los motores pueden optimizar la representación interna. Lo importante es comprender referencias, alcance y tiempo de vida.
loadData inicia la operación y termina. El callback de .then se ejecutará posteriormente en una llamada nueva.
Esto evita mantener la llamada original bloqueada mientras llega la respuesta, pero no significa que el código del callback se ejecute en paralelo con el JavaScript del hilo principal.
La profundidad no es automáticamente mala. Frameworks y librerías generan stacks extensos. Sin embargo, en código propio conviene revisar si cada nivel aporta una responsabilidad clara.
El siguiente bloque estudia Funciones, donde aplicaremos estos conceptos a declaraciones, expresiones, parámetros, callbacks, funciones de orden superior y closures.