Acceso a variables externas de funciones en JavaScript

Consideremos el siguiente código:

javascriptlet num = 1; // establecemos el valor de la variable

function func() {
  console.log(num); // lo mostramos en la consola
}

func(); // llamamos a la función

Como mencioné anteriormente, el valor de la variable no necesariamente tiene que estar antes de la definición de la función, lo principal es que esté antes de su llamada:

javascriptfunction func() {
  console.log(num);
}

let num = 1;
func();

En realidad, esto no es del todo cierto. Nuestra función sabe el valor de la variable incluso antes de su llamada num:

javascriptlet num = 1;

function func() {
  console.log(num); // la función ya sabe que num = 1
}

He aquí un ejemplo más complejo:

javascriptlet num = 1; // en este momento la función se entera de que num = 1

function func() {
  console.log(num);
}

num = 2; // en este momento la función se entera de que num = 2

Añadamos llamadas a la función:

javascriptlet num = 1; // en este momento la función se entera de que num = 1
func(); // mostrará 1

function func() {
  console.log(num);
}

func(); // mostrará 1
num = 2; // en este momento la función se entera de que num = 2
func(); // mostrará 2

Una vez más: en realidad, la función conoce los valores de las variables externas, incluso sin ser llamada.