Leksyczne otoczenie funkcji w JavaScript

Wszystkie zewnętrzne, dostępne dla funkcji zmienne, nazywane są jej leksycznym otoczeniem (LexicalEnvironment).

W następnym przykładzie funkcji dostępne są dwie zmienne: num1 i num2, które stanowią leksyczne otoczenie naszej funkcji:

javascriptlet num1 = 1;
let num2 = 2;

function func() {
  // funkcja zna zmienne num1 i num2
}

Samo leksyczne otoczenie reprezentuje swego rodzaju wewnętrzny obiekt JavaScript, powiązany z naszą funkcją. W tym przypadku można go przedstawić w następującej formie:

javascript{num1: 1, num2: 2}

Wartość dowolnej zmiennej leksycznego otoczenia zawsze równa się bieżącej wartości tej zmiennej:

javascriptlet num1 = 1; // otoczenie {num1: 1}
let num2 = 2; // otoczenie {num1: 1, num2: 2}

// Zmieńmy zmienną num1:
num1 = 123; // otoczenie {num1: 123, num2: 2}

function func() {
  
}

Kiedy próbujemy odwołać się do jakiejkolwiek zmiennej wewnątrz funkcji, zmienna ta najpierw jest wyszukiwana wśród lokalnych zmiennych funkcji i, jeśli takiej zmiennej tam nie ma, jest wyszukiwana w leksycznym otoczeniu funkcji.