Досціп да знешніх зменных функцый у 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

Яшчэ раз: на самой справе функцыя ведае значэння знешніх зменных, нават не будучы выкліканай.