Недавно я узнал об одной из самых фундаментальных концепций JavaScript под названием «замыкание» и почувствовал некоторое облегчение, когда мне сказали, что она также является одной из наименее понятных. Прошла неделя, а я все еще размышляю об этом, но я сделаю все возможное, чтобы описать закрытие, как я его понимаю (с большой помощью ресурсов, которые вы можете найти внизу).

Приступая к работе, мы узнаем об области видимости функции и о том, как переменные, объявленные глобально или внутри области действия функции, доступны в любом месте внутри этой области видимости или любой из внутренних областей видимости. Я уверен, что все мы сталкивались с одной или двумя (или тремя, или более) ошибками ссылки при попытке доступа к значению переменной в области, в которой она недоступна.

Замыкание позволяет получить доступ к области действия функции через «рюкзак» после завершения выполнения функции и ее удаления из стека вызовов. Отличным примером является функция makeAdder:

function makeAdder(x) {
// parameter `x` is an inner variable
// inner function `add()` uses `x`; it has “closure” over it
        function add(y) {
             return y + x;
        };
 return add;
}

Ссылка на внутреннюю функцию `add()` возвращается каждый раз, когда вызывается `makeAdder()` и запоминает любой аргумент, переданный для `x`.

Итак, когда мы используем makeAdder, объявляя переменную plusOne и присваивая ее значение makeAdder(1):

// `plusOne` is getting a reference to the inner `add()` function that has a closure over `x`
const plusOne = makeAdder(1);
// plusOne is passed 3 as an argument returning 4
plusOne(3); // 4
// because it adds 3, the inner y of add(), to the remembered value x

Мне предстоит пройти долгий путь, чтобы по-настоящему понять концепцию замыкания, и я должен поблагодарить Уилла Сентанса из CodeSmith и Кайла Симпсона из You Don’t Know JS за то, что они открыли дверь и помогли мне пройти через нее.

Ознакомьтесь с Вы не знаете JS Кайла Симпсона и Семинары Codesmith Уилла Сентанса. Поистине удивительные ресурсы от двух людей, которые невероятно хорошо осведомлены и стремятся учить.