Практическое применение замыканий в JavaScript с примерами
Быстрый ответ
Замыкания в JavaScript это мощный инструмент, с помощью которого можно организовывать инкапсуляцию данных. Они позволяют создавать функции с приватными переменными, которые нельзя изменить извне. Это помогает обеспечить целостность и безопасность данных. Давайте рассмотрим пример счетчика с приватной переменной:
function createCounter() {
  let count = 0;
  return () => ++count;
}
const myCounter = createCounter();
console.log(myCounter()); // Выводит "1"
console.log(myCounter()); // Выводит "2"
В этом примере замыкания используются для защиты данных и создания функций-фабрик в JavaScript.

Модульный паттерн: Публичные и приватные части
Магия модульного проектирования
Благодаря замыканиям, модульный паттерн в JavaScript позволяет создавать структурированный и поддерживаемый код. Этот паттерн служит для сокрытия внутреннего состояния и предоставления публичного API, что защищает данные от случайных изменений.
var myModule = (function() {
  var privateVariable = 'секретное послание';
  function privateMethod() {
    console.log(privateVariable);
  }
  return {
    publicMethod: function() {
      privateMethod();
    }
  };
})();
myModule.publicMethod(); // Выводит 'секретное послание'
Публичные и приватные элементы
С помощью замыканий мы можем формировать публичные и приватные элементы внутри объектов. Обращение к публичным методам обходится безопасно и не затрагивает приватное состояние объекта.
Сохранение состояний: Счетчики, колбэки и др.
Многофункциональность счетчиков
Замыкания незаменимы при сохранении последовательности операций, например, в счетчиках или при генерации уникальных идентификаторов:
function uniqueIDCreator() {
  let id = 0;
  return () => ++id;
}
const getUniqueID = uniqueIDCreator();
getUniqueID(); // 1
getUniqueID(); // 2
Замыкания и обработка событий
В работе с событиями и асинхронными коллбеками замыкания тоже необходимы, так как позволяют сохранять контекст для обработки будущих событий или ответов.
function createClickHandler(message) {
  return function() {
    alert(message);
  };
}
var button = document.querySelector('button');
button.addEventListener('click', createClickHandler('Нажми на курок!'));
Устранение дребезга и сглаживание потока выполнения
Улучшение взаимодействия с пользователем
Замыкания эффективно оптимизируют пользовательский интерфейс с помощью техник throttle и debounce. Это позволяет контролировать частоту выполнения функций, например, при изменении размеров окна или прокрутке страницы:
function throttle(func, limit) {
  let inThrottle;
  return function() {
    const args = arguments;
    const context = this;
    if (!inThrottle) {
      func.apply(context, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}
function debounce(func, delay) {
  let inDebounce;
  return function() {
    const context = this;
    clearTimeout(inDebounce);
    inDebounce = setTimeout(() => func.apply(context, arguments), delay);
  };
}
Сглаживание взаимодействия
Благодаря замыканиям можно избежать ненужных вызовов функций, что повышает производительность и обеспечивает плавность пользовательского опыта.
Замыкания в циклах
Циклы и области видимости
Замыкания эффективно решают проблему циклов в JavaScript, предоставляя каждой итерации собственную область видимости и, следовательно, контекст выполнения:
for (var i = 1; i <= 3; i++) {
  (function(index) {
    setTimeout(function() {
      console.log('Индекс: ' + index);
    }, i * 1000);
  })(i);
}
// Выводит:
// Индекс: 1 (после 1с)
// Индекс: 2 (после 2с)
// Индекс: 3 (после 3с)
Визуализация
Вообразите себе ящик с инструментами, который имеет особенность запоминать последний использованный инструмент:
function toolbox() {
  let lastUsedTool = null;
  
  return function(tool) {
    if (tool) {
      lastUsedTool = tool;
    }
    return lastUsedTool;
  };
}
Каждый раз, когда вы достаете инструмент:
🧰 -> 🗄️ -> 🛠 (последний инструмент возвращается вам в руки)
Инкапсуляция данных и управление состоянием приложения
Замыкания, будучи не только частью функций, играют ключевую роль в управлении состоянием в больших приложениях. Изоляция состояний с помощью замыканий снижает риск конфликтов и помогает сохранять состояние приложения на протяжении жизненного цикла модулей.
Полезные материалы
- Замыкания — JavaScript | MDN — подробный гид по замыканиям в JavaScript.
- Область видимости переменных, замыкания — простые объяснения концепции замыканий с примерами кода.
- Замыкания в JavaScript: разгадка тайны — SitePoint — понятное описание замыканий на примерах из практики.
- Учебник по замыканиям в JavaScript с примерами кода — freeCodeCamp — пошаговое руководство по замыканиям с примерами кода.
- Простое руководство, которое поможет вам понять замыкания в JavaScript | by Prashant Ram | Medium — упрощенный ввод в необходимость замыканий.
- Функции высшего порядка :: Eloquent JavaScript — разбор роли замыканий в функциях высшего порядка и основах функционального программирования.
- 7 вопросов о замыканиях на собеседовании по JavaScript. Сможете ответить? — тест на знание замыканий с примерами вопросов для собеседования.


