Доступ к внешним переменным функций в 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

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