Přístup k externím proměnným funkcí v JavaScriptu

Podívejme se na následující kód:

javascriptlet num = 1; // nastavíme hodnotu proměnné

function func() {
  console.log(num); // vypíšeme ji do konzole
}

func(); // zavoláme funkci

Jak jsem již zmiňoval dříve, hodnota proměnné nemusí nutně být před definicí funkce, hlavní je, aby byla před jejím voláním:

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

let num = 1;
func();

Ve skutečnosti to není tak úplně pravda. Naše funkce již dokonce před svým voláním zná hodnotu proměnné num:

javascriptlet num = 1;

function func() {
  console.log(num); // funkce již ví, že num = 1
}

Zde je složitější příklad:

javascriptlet num = 1; // funkce v tomto okamžiku zjistí, že num = 1

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

num = 2; // funkce v tomto okamžiku zjistí, že num = 2

Přidejme volání funkce:

javascriptlet num = 1; // funkce v tomto okamžiku zjistí, že num = 1
func(); // vypíše 1

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

func(); // vypíše 1
num = 2; // funkce v tomto okamžiku zjistí, že num = 2
func(); // vypíše 2

Ještě jednou: ve skutečnosti funkce zná hodnoty externích proměnných, dokonce i když není volána.