Estaba jugando con los ámbitos de JS para comprender mejor el concepto. Haciendo eso, escribí el siguiente script:
{ let a; function x() { let p; var q; } } x();
Sorprendentemente, al depurar en la consola de desarrollo de Chrome, me di cuenta de que si detengo el script en la línea 2 o let a
, puedo ver el alcance del bloque con la variable a
y la función x
como se ve en la captura de pantalla 1.
Además, al registrar las salidas de window.x
undefined
Sin embargo, tan pronto como salte al siguiente punto de interrupción, que es la línea 4 o let p
, el alcance del bloque ya no está allí y se crea un alcance local
. Ahora, al iniciar sesión, window.x
genera la definición de la función.
Ahora, según tengo entendido, dado que puedo llamar a x()
desde el ámbito global, significa que la declaración de la función está disponible en el ámbito global. Entonces, ¿por qué el enlace de la función no está disponible antes de la creación del contexto de ejecución de la función (si se eleva al alcance global)? ¿Y por qué escribir x()
en la parte superior del bloque TypeError: x is not a function
?
Nota: No estoy escribiendo funciones como esta en ninguna parte, solo escribí este script para probar mi comprensión de los ámbitos. Disculpas si esta es una forma incorrecta de escribir funciones.
EDITAR por comentarios:
Chrome y FF se muestran undefined
, mientras que Safari muestra la definición de la función.
console.log(x); // logs undefined { let a; function x() { let p; var q; } } x();