Найти в Дзене
Сергей Б.

JavaScript/Замыкание

Замыкание - это способность функции запоминать область видимости, в которой эта функция была объявлена. Посмотрим пример: var b = 10; function func(a) { var с = 100; return a + b + с; } func(1); Переменная a является параметром функции func, а параметры функции всегда входят в область видимости функции, соответственно, переменная a свободно используется внутри func и недоступна извне. Переменная b объявлена в глобальной области видимости. Функция func тоже объявлена в глобальной области видимости. Если замыкание - это способность функции запоминать область видимости, в которой эта функция была объявлена, то функция func запомнила, что в момент объявления, в области видимости, в которой она была объявлена, была доступна переменная b, соответственно, функция func имеет доступ к этой переменной, а значит может использовать ее внутри себя. Переменная c является частью области видимости функции, т.к. была объявлена внутри функции, а значит, может свободно использоваться вн

Замыкание - это способность функции запоминать область видимости, в которой эта функция была объявлена.

Посмотрим пример:

var b = 10;
function func(a) {
var с = 100;
return a + b + с;
}
func(1);

Переменная a является параметром функции func, а параметры функции всегда входят в область видимости функции, соответственно, переменная a свободно используется внутри func и недоступна извне.

Переменная b объявлена в глобальной области видимости. Функция func тоже объявлена в глобальной области видимости.

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

Переменная c является частью области видимости функции, т.к. была объявлена внутри функции, а значит, может свободно использоваться внутри func и недоступна извне.

В приведенном выше примере, функция вернет 111 Вместо a - 1, вместо b - 10, вместо c - 100:

1 + 10 + 100 = 111

Поиск переменных

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

В свою очередь, если и там эта переменная не была найдена, то поиск продолжиться в более высокой области видимости и так далее:

var b = 10;
function func(a) {
var с = 100;
function func2( ) {
return a + b + с;
}
return func2( );
}
func(1);

Объявлена функция func, а внутри нее еще одна функция - func2. func2 складывает значения переменных, в func возвращает результат вызова функции func2.

Интерес здесь представляет то, как func2 будет искать переменные.

При попытке обратиться к переменной a - будет произведен поиск внутри func2. Внутри func2 нет переменной a, значит, как говорилось выше - поиск продолжится в той области видимости, в которой была объявлена func2. В данном случае, этой областью видимости является область видимости функции func. И уже внутри func будет найдена переменная a.

Поиск переменной b будет произведен по тому же алгоритму.

Разница только в том, что внутри func нет переменной b, а значит поиск продолжится в области видимости, которая находится уровнем выше - в глобальной области, в которой и будет найдена переменная b.

С переменной c дело будет обстоять так же, как и с переменной b, т.к. переменная c является частью области видимости func.

Указанная ниже блок-схема отражает алгоритм поиска переменных внутри функций:

Алгоритм поиска переменных внутри функций
Алгоритм поиска переменных внутри функций