Практическое применение замыканий в JavaScript с примерами

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

JS
Скопировать код
function createCounter() {
  let count = 0;
  return () => ++count;
}

const myCounter = createCounter();
console.log(myCounter()); // Выводит "1"
console.log(myCounter()); // Выводит "2"

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

Кинга Идем в IT: пошаговый план для смены профессии

Модульный паттерн: Публичные и приватные части

Магия модульного проектирования

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

JS
Скопировать код
var myModule = (function() {
  var privateVariable = 'секретное послание';

  function privateMethod() {
    console.log(privateVariable);
  }

  return {
    publicMethod: function() {
      privateMethod();
    }
  };
})();

myModule.publicMethod(); // Выводит 'секретное послание'

Публичные и приватные элементы

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

Сохранение состояний: Счетчики, колбэки и др.

Многофункциональность счетчиков

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

JS
Скопировать код
function uniqueIDCreator() {
  let id = 0;
  return () => ++id;
}

const getUniqueID = uniqueIDCreator();
getUniqueID(); // 1
getUniqueID(); // 2

Замыкания и обработка событий

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

JS
Скопировать код
function createClickHandler(message) {
  return function() {
    alert(message);
  };
}

var button = document.querySelector('button');
button.addEventListener('click', createClickHandler('Нажми на курок!'));

Устранение дребезга и сглаживание потока выполнения

Улучшение взаимодействия с пользователем

Замыкания эффективно оптимизируют пользовательский интерфейс с помощью техник throttle и debounce. Это позволяет контролировать частоту выполнения функций, например, при изменении размеров окна или прокрутке страницы:

JS
Скопировать код
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, предоставляя каждой итерации собственную область видимости и, следовательно, контекст выполнения:

JS
Скопировать код
for (var i = 1; i <= 3; i++) {
  (function(index) {
    setTimeout(function() {
      console.log('Индекс: ' + index);
    }, i * 1000);
  })(i);
}

// Выводит:
// Индекс: 1 (после 1с)
// Индекс: 2 (после 2с)
// Индекс: 3 (после 3с)

Визуализация

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

JS
Скопировать код
function toolbox() {
  let lastUsedTool = null;
  
  return function(tool) {
    if (tool) {
      lastUsedTool = tool;
    }
    return lastUsedTool;
  };
}

Каждый раз, когда вы достаете инструмент:

Markdown
Скопировать код
🧰 -> 🗄️ -> 🛠 (последний инструмент возвращается вам в руки)

Инкапсуляция данных и управление состоянием приложения

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

Полезные материалы

  1. Замыкания — JavaScript | MDN — подробный гид по замыканиям в JavaScript.
  2. Область видимости переменных, замыкания — простые объяснения концепции замыканий с примерами кода.
  3. Замыкания в JavaScript: разгадка тайны — SitePoint — понятное описание замыканий на примерах из практики.
  4. Учебник по замыканиям в JavaScript с примерами кода — freeCodeCamp — пошаговое руководство по замыканиям с примерами кода.
  5. Простое руководство, которое поможет вам понять замыкания в JavaScript | by Prashant Ram | Medium — упрощенный ввод в необходимость замыканий.
  6. Функции высшего порядка :: Eloquent JavaScript — разбор роли замыканий в функциях высшего порядка и основах функционального программирования.
  7. 7 вопросов о замыканиях на собеседовании по JavaScript. Сможете ответить? — тест на знание замыканий с примерами вопросов для собеседования.