Достъп до външни променливи на функции в JavaScript

Нека разгледаме следния код:

javascriptlet num = 1; // задаваме стойност на променливата

function func() {
  console.log(num); // извеждаме я в конзолата
}

func(); // извикваме функцията

Както вече споменах, стойността на променливата не е задължително да е преди дефиницията на функцията, важното е да е преди нейното извикване:

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

let num = 1;
func();

Всъщност това не е съвсем точно. Нашата функция дори преди собственото си извикване знае стойността на променливата num:

javascriptlet num = 1;

function func() {
  console.log(num); // функцията вече знае, че num = 1
}

Ето по-сложен пример:

javascriptlet num = 1; // функцията в този момент разбира, че num = 1

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

num = 2; // функцията в този момент разбира, че num = 2

Нека добавим извиквания на функцията:

javascriptlet num = 1; // функцията в този момент разбира, че num = 1
func(); // ще изведе 1

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

func(); // ще изведе 1
num = 2; // функцията в този момент разбира, че num = 2
func(); // ще изведе 2

Още веднъж: всъщност функцията знае стойностите на външните променливи, дори без да бъде извикана.