← Назад к вопросам

Приведи пример использования замыкания

2.0 Middle🔥 241 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Приведи пример использования замыкания

Замыкание (Closure) - это функция, которая имеет доступ к переменным из своей внешней функции, даже после того как внешняя функция завершила работу.

Как работает замыкание

function outer() {
  const message = 'Привет';
  
  function inner() {
    console.log(message);
  }
  
  return inner;
}

const greeting = outer();
greeting();  // "Привет" - inner помнит переменную message

Хотя outer() завершила работу, inner всё ещё имеет доступ к переменной message.

Пример 1: Счётчик с приватным состоянием

function createCounter() {
  let count = 0;
  
  return {
    increment: () => ++count,
    decrement: () => --count,
    getCount: () => count
  };
}

const counter = createCounter();
console.log(counter.increment());  // 1
console.log(counter.increment());  // 2
console.log(counter.getCount());   // 2

// count полностью приватна
console.log(counter.count);  // undefined

Пример 2: Функция-генератор ID

function idGenerator(prefix) {
  let id = 0;
  
  return () => prefix + (++id);
}

const userId = idGenerator('USER_');
const postId = idGenerator('POST_');

console.log(userId());   // USER_1
console.log(userId());   // USER_2
console.log(postId());   // POST_1

// Каждый генератор имеет свой счётчик в замыкании

Пример 3: Функция с кэшированием

function memoize(fn) {
  const cache = {};
  
  return (...args) => {
    const key = JSON.stringify(args);
    if (key in cache) return cache[key];
    
    const result = fn(...args);
    cache[key] = result;
    return result;
  };
}

const square = memoize(n => n * n);
console.log(square(5));  // вычисляет
console.log(square(5));  // из кэша

Пример 4: Модульный паттерн

const module = (function() {
  const data = [];
  
  return {
    add: (item) => data.push(item),
    get: () => [...data]
  };
})();

module.add('item1');
console.log(module.get());  // ['item1']
console.log(module.data);   // undefined - data приватна

Пример 5: Обработчик события

function setupButton(buttonId, title) {
  const button = document.getElementById(buttonId);
  
  button.addEventListener('click', () => {
    console.log(`${title} нажата`);  // замыкание помнит title
  });
}

setupButton('btn1', 'Кнопка 1');
setupButton('btn2', 'Кнопка 2');

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