Недавно я узнал об одной из самых фундаментальных концепций 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 Уилла Сентанса. Поистине удивительные ресурсы от двух людей, которые невероятно хорошо осведомлены и стремятся учить.