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

Для чего используется замыкание?

1.2 Junior🔥 291 комментариев
#JavaScript Core

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

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

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

# Замыкания в JavaScript

Замыкание (Closure) — это фундаментальный концепт JavaScript, который позволяет функции сохранять доступ к переменным из своей области видимости даже после её завершения. Это одна из самых мощных и часто используемых особенностей языка.

Основное определение

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

function createCounter() {
  let count = 0;
  
  return function increment() {
    count++;
    return count;
  };
}

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

Основные применения замыканий

1. Инкапсуляция и приватные переменные

До появления классов замыкания были основным способом создания приватных переменных:

function createBankAccount(initialBalance) {
  let balance = initialBalance;
  
  return {
    getBalance() {
      return balance;
    },
    deposit(amount) {
      balance += amount;
      return balance;
    },
    withdraw(amount) {
      if (amount <= balance) {
        balance -= amount;
        return balance;
      }
      return 'Insufficient funds';
    }
  };
}

const account = createBankAccount(1000);
console.log(account.getBalance()); // 1000
account.deposit(500);
console.log(account.getBalance()); // 1500

2. Фабричные функции и паттерн модуля

Замыкания используются для создания паттерна модуля:

const userModule = (() => {
  const users = [];
  
  return {
    addUser(name) {
      users.push(name);
    },
    getUsers() {
      return [...users];
    },
    removeUser(name) {
      const index = users.indexOf(name);
      if (index > -1) users.splice(index, 1);
    }
  };
})();

userModule.addUser('Alice');
userModule.addUser('Bob');
console.log(userModule.getUsers()); // ['Alice', 'Bob']

3. Функции высшего порядка и каррирование

function multiply(a) {
  return function(b) {
    return a * b;
  };
}

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

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

4. Обработка событий и колбэки

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

5. React hooks

Замыкания лежат в основе работы React hooks — useState, useEffect, useCallback и других используют замыкания для сохранения состояния.

function useMyHook() {
  const [state, setState] = React.useState(0);
  
  React.useEffect(() => {
    console.log(state); // замыкание над state
  }, [state]);
}

Важные моменты

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