Лексическое окружение функций в JavaScript

Все внешние, доступные функции переменные, называются ее лексическим окружением (LexicalEnvironment).

В следующем примере функции доступны две переменные: num1 и num2, которые и являются лексическим окружением нашей функции:

javascriptlet num1 = 1;
let num2 = 2;

function func() {
  // функция знает про переменные num1 и num2
}

Само лексическое окружение представляет собой некий внутренний объект JavaScript, привязанный к нашей функции. В данном случае его можно представить в следующем виде:

javascript{num1: 1, num2: 2}

Значение любой переменной лексического окружения всегда равно текущему значению этой переменной:

javascriptlet num1 = 1; // окружение {num1: 1}
let num2 = 2; // окружение {num1: 1, num2: 2}

// Поменяем переменную num1:
num1 = 123; // окружение {num1: 123, num2: 2}

function func() {
  
}

Когда мы пытаемся обратится к какой-либо переменной внутри функции, эта переменная вначале ищется среди локальных переменных функции и, если такой переменной там нет, то ищется в лексическом окружении функции.