# Применение лексического окружения функций в JavaScript

Пусть у нас есть функция, своим результатом возвращающая другую функцию:

`function test() { return function() { } }`

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

`function test() { let num = 1; // переменная родительской функции return function() { // лексическое окружение = {num: 1} } }`

Напишем в коде нашей возвращаемой функции алерт, выводящий в консоль значение переменной `num`:

`function test() { let num = 1; return function() { console.log(num); } }`

Давайте теперь вызовем родительскую функцию `test` и результат ее работы запишем в переменную `func`:

`function test() { let num = 1; return function() { console.log(num); } } let func = test();`

В переменную `func` запишется возвращаемая функция. Давайте вызовем нашу функцию - своим результатом она выведет содержимое переменной `num`:

`function test() { let num = 1; return function() { console.log(num); } } let func = test(); func(); // выведет 1`

Если же просто попытаться вывести переменную `num` вне функции - она будет недоступна:

`function test() { let num = 1; return function() { console.log(num); } } console.log(num); // переменная num тут недоступна`

Как вы видите, локальная переменная `num` привязалась к лексическому окружению нашей функции и теперь, вызвав в любом месте кода эту функцию, мы сможем получить значение переменной `num`, даже если в месте вызова сама по себе эта переменная и недоступна.

На самом деле аналогичного результата можно добиться, сделав переменную `num` глобальной:

`function test() { return function() { console.log(num); } } let num = 1; // глобальная переменная let func = test(); func(); // выведет 1`

Здесь, однако, будет существенная разница: в новом варианте переменную `num` можно менять вне функций (так как она глобальная), а в старом - нет.

Определите, не запуская код, что выведется в консоль:

`function test() { let num1 = 1; let num2 = 2; return function() { return num1 + num2; } } let func = test(); console.log(func());`

Определите, не запуская код, что выведется в консоль:

`function test() { let num1 = 1; let num2 = 2; return function() { return num1 + num2; } } console.log(test()());`

Определите, не запуская код, что выведется в консоль:

`function test() { let num1 = 1; return function() { return num1 + num2; } } let num2 = 2; let func = test(); console.log(func());`

Определите, не запуская код, что выведется в консоль:

`function test() { let num = 1; return function() { return num; } } let num = 2; let func = test(); console.log(func());`
← →
↑
en ru