Entiendo que debido al alcance léxico, los alcances de bloque pueden acceder a las variables de alcance adjuntas. Pero lo que no entiendo es cómo funciona realmente. ex:
function first(){ let i=10; function second(){ let j=20; console.log(i); if(j==20){ console.log(i); } } second(); }el primer console.log() obtiene el valor de i después de buscar la cadena de alcance en el objeto variable. Pero, ¿cómo la consola.log() dentro del bloque obtiene acceso a la variable i, ya que no crea un contexto de ejecución y, por lo tanto, no tiene una cadena de alcance?
El motor js almacena las declaraciones de funciones y variables elevadas (alzando) en la parte superior del ámbito particular en el que se declara esa variable o función. Las operaciones de asignación no se elevan. Entonces el motor sabe en qué variable de alcance o función se declara.
https://medium.com/@venomnert/how-js-engine-reads-your-code-df3cd36e4192
El artículo anterior describe cómo el motor js encuentra variables y algunos otros conceptos que pueden ser útiles para comprender los cierres y la ejecución del código.