JavaScript: сила замыканий

JavaScript: сила замыканий
JavaScript: сила замыканий

Узнайте все о замыканиях и о том, как использовать их в своем собственном коде

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

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

В этой статье о JavaScript 101 мы более подробно рассмотрим замыкания и рассмотрим некоторые практические варианты использования.

Что такое замыкания в JavaScript?

Всякий раз, когда вы определяете функцию в JavaScript, среда выполнения как бы делает снимок функции и всего ее окружения. Это включает в себя саму функцию, да, но также переменные из области видимости, в которой была определена функция.

Позвольте объяснить:

functionwrapper() {
let a =" 1;
let b =" "hello!";

returnfunctioninsideFunction() {
console.log("accessing outside variables: ", a, "-", b);
}
}

Видите этот код? Когда вы определяете insideFunction , сделанный снимок охватывает саму функцию, а также добавляет переменные a и b.

Другими словами, в JavaScript замыкание создается, когда внутренняя функция имеет доступ к переменным и параметрам внешней функции.

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

Создание приватных переменных с помощью замыканий

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

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

Это может быть полезно для защиты конфиденциальных данных или для создания более безопасного и простого в обслуживании инкапсулированного кода.

Вот пример использования замыканий для создания приватных переменных в JavaScript:

functioncreateCounter() {
let count =" 0;

returnfunction() {
count++;
console.log(count);
}
}

let counter =" createCounter();
counter(); // Output: 1
counter(); // Output: 2

В этом примере createCounter - это функция, которая создает новое замыкание каждый раз, когда она вызывается (потому что она определяет, а затем возвращает новую функцию). Каждое замыкание имеет доступ к своей собственной count переменной, которая доступна только изнутри замыкания. При counter вызове он увеличивает закрытую count переменную и записывает ее значение в консоль.

Другими словами, мы создали новую закрытую переменную: count

Обработчики событий

Еще один очень практичный вариант использования замыканий - это написание собственных обработчиков.

Рассмотрим сценарий, в котором вы хотите добавить прослушиватели событий к нескольким элементам веб-страницы. Один из способов сделать это - добавить отдельный прослушиватель событий к каждому элементу, вот так:

var buttons =" document.querySelectorAll('button');

for (var i =" 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', function() {
console.log('Button ' + i + ' clicked');
});
}

В этом примере мы выбираем все button элементы на странице и добавляем прослушиватель событий щелчка к каждому из них.

Однако, когда запускается событие click, для всех прослушивателей событий используется одна и та же переменная i, что означает, что результатом всегда будет "Нажата кнопка n", где n это значение buttons.length, потому что i оно всегда будет buttons.length таким ко времени запуска события click.

Чтобы решить эту проблему, мы можем использовать замыкания для инкапсуляции значения i в каждом прослушивателе событий:

var buttons = document.querySelectorAll('button');

for (var i = 0; i < buttons.length; i++) {
buttons[i].addEventListener('click', (function(index) {
return function() {
console.log('Button ' + index + ' clicked');
}
})(i));
}

В этом примере мы оборачиваем функцию прослушивания событий в другую функцию, которая принимает i в качестве аргумента и возвращает функцию прослушивания событий. Возвращаемая функция представляет собой замыкание, которое имеет доступ к значению index, переданному в качестве аргумента, которое является значением i во время создания замыкания.

При использовании замыканий каждый прослушиватель событий имеет свою собственную index переменную, которая отличается для каждого прослушивателя событий, и результатом будет "Кнопка n нажата", где n это индекс кнопки, на которую было нажато.

Создание повторно используемого кода

Замыкания также можно использовать для создания повторно используемого кода, который можно передавать по кругу и использовать в разных контекстах. Это особенно полезно, когда у вас есть функция, которая принимает обратный вызов в качестве аргумента, но вы хотите передать дополнительные аргументы обратному вызову без изменения исходной сигнатуры функции.

Вот пример использования замыканий для создания повторно используемой функции обратного вызова:

functioncreateCallback(arg1, arg2) {
returnfunction(result) {
console.log(arg1 + ' ' + arg2 + ' =" ' + "result);
}
}

const callback1 =" createCallback('5', '6');
const callback2 =" createCallback('10', '20');

callback1(11); // Output: 5 6 =" 11
callback2(30); // Output: 10 20 = 30

В этом примере createCallback это функция, которая возвращает новое замыкание каждый раз, когда она вызывается. Замыкание принимает один аргумент, result и регистрирует строку, которая объединяет arg1 , arg2 и result .

Это создает повторно используемую функцию обратного вызова, которая может передаваться различным функциям и использоваться в разных контекстах.

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

Конечно, это непростая концепция, и к ней может потребоваться некоторое привыкание, но как только вы освоите ее, уровень вашей игры на JavaScript повысится!

Итак, дерзайте и начните использовать замыкания в своем коде JavaScript уже сегодня!

Понравилась статья?
Будем признательны, если поделитесь в соцсетях или мессенджерах, а также присоединитесь к нашей группе Вконтакте. Будет интересно!

Другие статьи по теме:

15 удивительных трюков, которые вы можете сделать с помощью простого JavaScript
15 удивительных трюков, которые вы можете сделать с помощью простого JavaScript

Давайте рассмотрим некоторые из удивительных трюков, которые вы могли бы сделать с помощью ванильного JavaScript.

Как устанавливать, получать и обновлять файлы cookie с помощью JavaScript
Как устанавливать, получать и обновлять файлы cookie с помощью JavaScript

Файлы cookie — это небольшие фрагменты данных, хранящиеся в браузере клиента и часто используемые для управления сеансами, пользовательских предпочтений и отслеживания.

Бесплатные инструменты для очистки и украшения кода
Бесплатные инструменты для очистки и украшения кода

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

Некоторые функции кросс-браузерных DevTools или "инструментов разработчика", о которых вы, возможно, не знаете
Некоторые функции кросс-браузерных DevTools или "инструментов разработчика", о которых вы, возможно, не знаете

Мы проводим много времени в DevTools, и уверены, что вы тоже. Иногда даже переключаемся между ними, особенно когда отлаживаем кроссбраузерные проблемы. DevTools во многом похожи на сами браузеры — не все функции DevTools одного браузера будут такими же или поддерживаться в DevTools другого браузера.

JavaScript: Рекомендации и советы
JavaScript: Рекомендации и советы

В этом посте дана справочная информация по некоторым методам и операторам языка Javascript.

33 Концепции JavaScript, которые должен знать каждый разработчик
33 Концепции JavaScript, которые должен знать каждый разработчик

Как вы думаете, насколько хорошо вы знаете JavaScript? Вы, вероятно, знаете, как писать функции, понимать простые алгоритмы и даже можете написать класс. Но знаете ли вы, что такое типизированный массив?

Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам обеспечивать вас лучшим контентом. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Отключение cookie-файлов может привести к неполадкам в работе сайта. Продолжая пользоваться сайтом без изменения настроек, вы даете согласие на использование ваших cookie-файлов. Это совершенно безопасно!