Dostęp do zewnętrznych zmiennych funkcji w JavaScript

Rozważmy następujący kod:

javascriptlet num = 1; // ustawiamy wartość zmiennej

function func() {
  console.log(num); // wypisujemy ją w konsoli
}

func(); // wywołujemy funkcję

Jak już wcześniej wspomniałem, wartość zmiennej niekoniecznie musi być przed definicją funkcji, ważne, żeby była przed jej wywołaniem:

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

let num = 1;
func();

W rzeczywistości nie jest to do końca prawdą. Nasza funkcja nawet przed swoim wywołaniem zna wartość zmiennej num:

javascriptlet num = 1;

function func() {
  console.log(num); // funkcja już wie, że num = 1
}

Oto bardziej złożony przykład:

javascriptlet num = 1; // funkcja w tym momencie dowiaduje się, że num = 1

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

num = 2; // funkcja w tym momencie dowiaduje się, że num = 2

Dodajmy wywołania funkcji:

javascriptlet num = 1; // funkcja w tym momencie dowiaduje się, że num = 1
func(); // wypisze 1

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

func(); // wypisze 1
num = 2; // funkcja w tym momencie dowiaduje się, że num = 2
func(); // wypisze 2

Jeszcze raz: w rzeczywistości funkcja zna wartości zmiennych zewnętrznych, nawet nie będąc wywołana.