Curso de Closures y Scope en JavaScript

¿Qué es el Hoisting?

Curso de Closures y Scope en JavaScript

Contenido del curso

Bienvenida

  • 1
    Bienvenida al Curso de Closures y Scope

    Bienvenida al Curso de Closures y Scope

    01:11 min

Tipos de scope en JavaScript

  • 2
    Global Scope

    Global Scope

    12:09 min
  • 3
    Function Scope

    Function Scope

    05:52 min
  • 4
    Block Scope

    Block Scope

    07:16 min
  • 5
    Reasignación y redeclaración

    Reasignación y redeclaración

    14:05 min
  • 6
    Strict Mode

    Strict Mode

    05:54 min

Closure

  • 7
    ¿Qué es un Closure?

    ¿Qué es un Closure?

    09:37 min
  • 8
    Practicando Closures

    Practicando Closures

    15:24 min

Hoisting

  • 9
    ¿Qué es el Hoisting?

    ¿Qué es el Hoisting?

    Viendo ahora

Debugging

  • 10
    Debugging

    Debugging

    04:33 min

Cierre

  • 11
    Conclusiones

    Conclusiones

    03:23 min
schoolTomar examen
search
CursosEmpresasBlogLiveConfEventosPrecios

0:00/8:28

¿Qué es el Hoisting?

Curso de Closures y Scope en JavaScript

Clase 9 de 11

Clase 9 / 11

Progreso del curso

Bienvenida

  • 1

    Bienvenida al Curso de Closures y Scope

    01:11

Tipos de scope en JavaScript

  • 2lock

    Global Scope

    Suscríbete para ver más
  • 3lock

    Function Scope

    Suscríbete para ver más
  • 4lock

    Block Scope

    Suscríbete para ver más
  • 5lock

    Reasignación y redeclaración

    Suscríbete para ver más
  • 6lock

    Strict Mode

    Suscríbete para ver más

Closure

  • 7lock

    ¿Qué es un Closure?

    Suscríbete para ver más
  • 8lock

    Practicando Closures

    Suscríbete para ver más

Hoisting

  • play_arrowlock

    ¿Qué es el Hoisting?

    play_circleViendo ahora

Debugging

  • 10lock

    Debugging

    Suscríbete para ver más

Cierre

  • 11lock

    Conclusiones

    Suscríbete para ver más
workspace_premiumTomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

Comentarios (32)32 comentarios

Recursos

Hoisting es un término para describir que las declaraciones de variables y funciones son desplazadas a la parte superior del scope más cercano, scope global o de función. Esto sucede solamente con las declaraciones y no con las asignaciones.

El código permanece igual, solo es una interpretación del motor de JavaScript. En el caso de las variables solamente sucede cuando son declaradas con var.

Hoisting en variables declaradas con var

En el siguiente código, la respuesta del console.log es undefined, porque al hacer referencia a una variable que no está declarada aún, JavaScript crea esta variable antes de declararla y le asigna un valor de undefined.

console.log(nombre) // undefined var nombre = "Andres"
// Hoisting var nombre = undefined console.log(nombre) nombre = "Andres"

Hoisting en scope de bloque

Mira el siguiente código y piensa cuál sería el resultado del console.log.

if (true){ var saludo = "hola" let despedida = "chao" } console.log(saludo) console.log(despedida)

La respuesta es primero "hola" y luego un error de referencia. Esto sucede por el hoisting, la declaración de la variable saludo se eleva fuera del bloque en un scope superior, que puede ser un scope de función o global.

var saludo = undefined if (true){ saludo = "hola" let despedida = "chao" } console.log(saludo) // "hola" console.log(despedida) // ReferenceError: despedida is not defined

Es por eso que var no tiene scope de bloque, y se debe tener cuidado porque puede provocar errores en el código.

Hoisting en funciones

Mira el siguiente código y piensa cuál sería el resultado del console.log.

console.log( saludar() ) function saludar() { return "Hola" }

La respuesta es "Hola", porque al invocar una función que no está declarada, JavaScript la eleva y por eso podemos invocar una función antes de declararla.

// Hoisting function saludar() { return "Hola" } console.log( saludar() ) // "Hola"

Pero, lo que realmente sucede es que JavaScript guarda la función en memoria en la fase de creación de un contexto de ejecución, no asigna undefined como con las variables.

Hoisting de variables dentro de una función

El hoisting desplaza las declaraciones a la parte superior del scope más cercano, en el caso de una función dentro de otra función, seguiría el siguiente comportamiento.

function scope() { console.log(nombre) // undefined console.log(edad) // undefined console.log(i) // undefined var nombre = "Andres" var edad = 20 for (var i = 0; i< 6; i++) { //... } }

JavaScript lo interpretaría como lo siguiente:

function scope() { var nombre = undefined var edad = undefined var i = undefined console.log(nombre) // undefined console.log(edad) // undefined console.log(i) // undefined nombre = "Andres" edad = 20 for ( i = 0; i< 6; i++) { // } }

Hosting en funciones asignadas a variables

Mira el siguiente código y piensa cuál sería el resultado del console.log.

console.log( saludar() ) var saludar = function saludar() { return "hola" }

La respuesta es un error de tipo porque si asignas una función a una variable declarada con var, y la invocas antes declararla, la variable será de tipo undefined y no de función por el hoisting.

var saludar = undefined console.log( saludar() ) // TypeError: saludar is not a function saludar = function saludar() { return "hola" }

Hoisting con let y const

Aunque te haya dicho que el hoisting solo ocurre con declaraciones con var, no es totalmente cierto. El hoisting hará que el intérprete de JavaScript eleve las declaraciones con let y const a la Temporal Dead Zone.

La Temporal Dead Zone es una región del código donde la variable está declarada, pero no es posible acceder a esta, provocando un error de tipo ReferenceError.

console.log(nameVar) // undefined console.log(nameLet) // ReferenceError: nameLet is not defined var nameVar = "myVar" let nameLet = "myLet"

Buenas prácticas para usar hoisting

  • No utilices var en las declaraciones de variables.
  • Escribe primero las funciones y luego su invocación.

Contribución creada por Andrés Guano.

Cristian Fernando Villca Gutierrez

Cristian Fernando Villca Gutierrez

Hace 4 años
    Rafael Martínez Rodríguez

    Rafael Martínez Rodríguez

    Hace 4 años
    Griger Ratia

    Griger Ratia

    Hace 4 años
Aranxa Martinez

Aranxa Martinez

Hace 4 años
    Andres Prieto

    Andres Prieto

    Hace 4 años
    Diego Hanssel Perez

    Diego Hanssel Perez

    Hace 4 años
Alfredo Olmedo

Alfredo Olmedo

Hace 4 años
Oscar Fuentes Esteves

Oscar Fuentes Esteves

Hace 4 años
    Andres Prieto

    Andres Prieto

    Hace 4 años
    Xavier Flores

    Xavier Flores

    Hace 3 años
Juan Guillermo Perez Cardozo

Juan Guillermo Perez Cardozo

Hace 4 años
Elkin Alfonso Rey Ladino

Elkin Alfonso Rey Ladino

Hace 4 años
    Andres Prieto

    Andres Prieto

    Hace 4 años
silfredo mario

silfredo mario

Hace 4 años
Tanelo Mondaca Silva

Tanelo Mondaca Silva

Hace 4 años
German Cavani

German Cavani

Hace 4 años
Dario Paladines

Dario Paladines

Hace 4 años
Natalia Gallego Heras

Natalia Gallego Heras

Hace 2 años
Daniel Flores

Daniel Flores

Hace un año
Rodrigo Cazard

Rodrigo Cazard

Hace 4 años
    Jossue Emmanuel Fuentes

    Jossue Emmanuel Fuentes

    Hace 4 años
    Andres Cavedal

    Andres Cavedal

    Hace 4 años
Ricardo Alfonso Chavez Vilcapoma

Ricardo Alfonso Chavez Vilcapoma

Hace 3 años
John Jaramillo

John Jaramillo

Hace 3 años
Jefred Bedoya

Jefred Bedoya

Hace 6 meses•editado
andres gonzalez

andres gonzalez

Hace 4 años
    Francisco Ponce

    Francisco Ponce

    Hace 4 años
Renato Riva Ramos

Renato Riva Ramos

Hace 4 años
    Francisco Ponce

    Francisco Ponce

    Hace 4 años
Pablo Diaz

Pablo Diaz

Hace 3 años
    Valentina Llorente Hernández

    Valentina Llorente Hernández

    Hace 2 años
Andrés Villarraga

Andrés Villarraga

Hace 3 años
    Andrés Villarraga

    Andrés Villarraga

    Hace 3 años

Mis aportes:

  • El hosting solo aplica a variables declaradas con var, si intentamos hacer un ejemplo similar con let o const tendremos errores:
console.log(x); //❌ ReferenceError: Cannot access 'x' before initialization let x = 5;

  • El hosting para funciones solo aplica para funciones declaradas usando la palabra reservada function, si intentamos aplicarlo a arrow functions tendremos errores también:
console.log(saludo()) //✅ "Hola" function saludo(){ return "Hola" } console.log(despedida()) //❌ ReferenceError: Cannot access 'despedida' before initialization const despedida = () => { return "Bye" }

Muchas gracias por la aclaración

BUen aporte

Es importante recalcar que el Hoisting en las funciones, solo afecta a aquellas que estén escritas con la sintaxis de "Function Declaration", si intentamos con otras sintaxis, arrow o function expression, nos mandará un error.

Captura de pantalla 2022-06-26 001430.png

¿Recuerdas que JS "lee" 2 veces? Sí, los está afectando, solo que estás comparando 2 momentos diferentes

La palabra clave "function" y el nombre de su función se lee en la "primera pasada", la invocación de "myFunction" en la "segunda pasada"

myFunction() function myFunction () { console.log("Voy primero") }

En este segundo ejeplo "const" y su nombre se leen en las "primera pasada", más no lo que vale "myVar", es decir; no coge lo que está después del igual; el engine separa un espacio en memoria con la etiqueta "myVar" y lo deja a la espera de meter la información en ese espacio, pero eso lo hace en la "segunda pasada" y es en esa que invoca a "myVar()" pero en ese momento "myVar" no es una función, solo es un espacio en memoria, es decir; myVar en ese momento en el que es invocada es igual a un espacio en memoria por lo que falla y esto tiene sentido. ¿Qué tal si una función me da el contexto de todos mis usuarios, pero yo antes de tener el espacio para guardar esa información ya la estoy leyendo? Leería vacio... Ese es el origen de ese error

myVar() const myVar = () => { console.log("Voy a fallar") }

el problema es que estas llamando la función antes de inicializara, el erro te lo va a mostrar si o si, la variable tiene que estar por encima del código donde la vayas a usar(al principio de todo incluso si es una variable función o en un bloque es lo que se recomienda) .salu2.

El concepto de Hoisting fue pensado como una manera general de referirse a cómo funcionan los contextos de ejecución en JavaScript (específicamente las fases de creación y ejecución).

  • Las Variables y las funciones se procesan antes de ejecutar el código
  • Las funciones antes que las Variables

Conceptualmente, por ejemplo, una estricta definición de hoisting sugiere que las declaraciones de variables y funciones son físicamente movidas al comienzo del código

Lo que sucede es que las declaraciones de variables y funciones son asignadas en memoria durante la fase de compilación, pero quedan exactamente en dónde las has escrito en el código.

Buenas Prácticas: Las funciones se deben de declarar al inicio del código

A pesar de ésta caracteristica, yo sigo declarando antes de usar. Costumbres de haber empezado con otros lenguajes.

En JS eso puede ser menos óptimo, te sugiero usar snippets; la micro optimización también muestra seniority después de todo

excelnte respuesta de Andres

Ya conocia bien sobre hoisting, pero este profesor lo explico de la mejor manera jamas vista.

La recomendación es no usar var solo let y const eso es lo que se dice en ES6, y así evitar los errores del hoisting que son considerados una mala práctica o por lo menos es lo que se recomienda en mi empresa desde el primer día que entre.

Allá tienen buenas prácticas, var también usar más RAM

TEMPORAL DEAD ZONE.

Las variables declaradas con las palabras claves (let, const), entran a una zona conocida como zona muerta. Es decir, que todo el código que necesite de estas variables no se va a ejecutar hasta que están tengan un valor asignado.

Pennywise es experto en hoisting 🎈

El concepto de hoisting es que las funciones y las variables declaradas se "elevan", pero no lo hacen literalmente en el código, sino en la memoria de Javascript, es decir al momento que corremos nuestro código y este va a empezar a compilar JS "agarra" todas las variables y funciones(OJO: solo las declaraciones, ya que la inicialización de las variables lo hará de acuerdo a la ejecución del código) y las pone hasta el inicio y luego empieza a ejecutar el código,

Súper, esta sí lo entendí todo perfecto 👌🏼 y agradezco mucho el resumen de debajo 🫡

Resumen breve: ¿Qué es el Hoisting?

El hoisting es un comportamiento de JavaScript donde las declaraciones de variables (var) y funciones se "elevan" al inicio del scope (global o de función), antes de que se ejecute el código. Sin embargo, solo las declaraciones, no las asignaciones, son elevadas.

🔹 Variables con var:

console.log(nombre); // undefined var nombre = "Andres";

JavaScript lo interpreta así:

var nombre; console.log(nombre); // undefined nombre = "Andres";

🔹 Funciones declaradas:

console.log(saludar()); // "Hola" function saludar() { return "Hola"; } ```Las funciones se elevan **completamente**, por eso puedes invocarlas antes. 🔹 Funciones asignadas a variables (`var`): ```js console.log(saludar()); // ❌ Error var saludar = function () { return "Hola"; };

Aquí, saludar es undefined al momento de la llamada → TypeError.

🔹 Bloques con let y const:

console.log(x); // ❌ ReferenceError let x = 5;

Aunque hay hoisting, let y const caen en la "zona muerta temporal" (TDZ), donde no se puede acceder a ellas antes de declararlas.

.

🔹 Buenas prácticas:

  • ✅ Usa let y const, evita var.
  • ✅ Declara variables y funciones antes de usarlas para mayor claridad.

🔁 Conclusión: El hoisting puede causar errores difíciles de detectar. Entenderlo te ayuda a escribir código más predecible y seguro.

Hola compañeros, alguno conoce la terminal que tiene el profesor? me parece muy bonita y practica

La termina que utiliza al seleccionar el código es Code Runner

https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner

Okay code runner es lo que arranca el codigo, pero para tener la misma interfaz que tiene el en VsCode alguien la sabe?

Buenas prácticas para usar hoisting

No utilices var en las declaraciones de variables. Escribe primero las funciones y luego su invocación.

Buenas prácticas para usar hoisting No utilices var en las declaraciones de variables. Escribe primero las funciones y luego su invocación.

Conclusión... No utilices el hoisting jajaja. Hablando en serio... Es un concepto bastante interesante.

El Hoisting es el comportamiento de JavaScript donde las declaraciones de variables y funciones se mueven conceptualmente al inicio de su ámbito antes de ejecutarse.

Puntos clave

  • var vs let/const: Las variables declaradas con var se elevan e inicializan como undefined. Las declaradas con let o const también se elevan, pero permanecen en una "zona muerta temporal" sin inicializar.
  • Funciones: Las declaraciones de funciones se elevan completas, permitiendo invocarlas antes de su definición en el código.
  • Expresiones de función: No se elevan como funciones; siguen las reglas de la variable que las contiene.

Por que este codigo si devuelve "elmo"?

nameOfDog("Elmo"); function nameOfDog(name) { console.log(name); };

El código en cuestión devuelve "Elmo" porque se trata de una función que recibe un parámetro name y lo imprime en la consola utilizando console.log(name).

En este caso, se llama a la función nameOfDog con el argumento "Elmo", lo que significa que el valor de name dentro de la función será "Elmo". Luego, la función simplemente imprime ese valor utilizando console.log(name).

Es importante destacar que en JavaScript, las funciones se pueden llamar antes de que se definan en el código, gracias al proceso de "hoisting" que realiza el intérprete de JavaScript al procesar el código. Por lo tanto, aunque la llamada a nameOfDog aparezca antes de la definición de la función, el intérprete de JavaScript puede identificar la función y ejecutarla correctamente cuando se llama.

En resumen, la función nameOfDog recibe el argumento "Elmo" y lo imprime en la consola, por lo que el resultado final será la cadena de texto "Elmo".

Es la segunda vez que veo esto, me pregunto el porqué no lo comparan con Css que funciona por cascada?

Como tal, el "hoisting" en JavaScript no funciona de la misma manera que la manera en que funcionan las sheets de CSS. Pudiera ser que en términos de especificidad de un selector, pero creo que no sería del todo adecuado.

Recuerda que el "hoisting" en JavaScript se refiere a cómo las variables y las funciones declaradas se mueven automáticamente al principio del ámbito en el que están definidas, antes de que se ejecute cualquier código en ese ámbito. Esto significa que puedes usar una variable o función antes de declararla y no recibirás un error, ya que JavaScript ha movido automáticamente la declaración al principio del ámbito.

COMO SE COMENTA EL CODIGO, COMO LO HACE EL PROFE? EN EL MINUTO 4:34

teclado en español es: ctrl + k + c

teclado en ingles es; ctrl + /

Aunque en la teoría esta bien, creo que al pasar por Node esta usando el modo estricto, por eso el undefined, un ejemplo más claro de Hoisting es este:

image.png

En tiempo de ejecución, el hoisting permite que el motor cambie el orden del código para que la variable exista a la hora de usarla, pueden probar en la consola del browser.

Usando modo estricto:

image.png