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

Что такое Closures в JavaScript?

1.8 Middle🔥 231 комментариев
#Node.js и JavaScript

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

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

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

Closures в JavaScript

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

Основной пример

function outer() {
  const message = 'Hello';
  return function inner() {
    console.log(message);
  };
}

const greet = outer();
greet(); // 'Hello'

Почему это работает?

Scope Chain: каждая функция помнит переменные из родительской области видимости. Когда inner вызывается, она всё ещё имеет доступ к message из outer.

Практические применения

1. Приватные переменные

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

const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
// count недоступна напрямую

2. Data Privacy в классах

function createBankAccount(balance) {
  return {
    deposit: (amount) => balance += amount,
    withdraw: (amount) => balance -= amount,
    getBalance: () => balance
  };
}

3. Function Factories

function createMultiplier(multiplier) {
  return (n) => n * multiplier;
}

const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(double(5)); // 10
console.log(triple(5)); // 15

4. Callbacks и Event Handlers

const buttons = document.querySelectorAll('button');
buttons.forEach((button, index) => {
  button.addEventListener('click', () => {
    console.log(`Button ${index} clicked`);
  });
});

5. Module Pattern

const Calculator = (function() {
  let history = [];
  
  return {
    add: (a, b) => {
      const result = a + b;
      history.push({ operation: 'add', a, b, result });
      return result;
    },
    getHistory: () => history
  };
})();

6. Memoization (Caching)

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

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

Проблема: var в циклах

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0);
}
// Выведет: 3, 3, 3 (одна i для всех функций)

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0);
}
// Выведет: 0, 1, 2 (каждый let создаёт closure)

Memory Leaks

Closure может хранить в памяти большие объекты. Если функция больше не используется, объекты могут занимать память.

function createProcessor(hugeData) {
  // hugeData будет в памяти пока функция существует
  return () => hugeData[0];
}

Заключение

Closures — фундаментальная концепция JavaScript:

  • ✅ Создаются автоматически
  • ✅ Позволяют приватные переменные
  • ✅ Используются в callbacks, HOF, модулях
  • ✅ Важны для async операций
  • ⚠️ Могут вызвать memory leaks