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

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

1.6 Junior🔥 191 комментариев
#Node.js и JavaScript

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

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

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

Пример использования Closure в JavaScript/Node.js

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

Классический пример: Счётчик

function createCounter() {
  let count = 0; // Приватная переменная
  
  return {
    increment() {
      return ++count;
    },
    decrement() {
      return --count;
    },
    getCount() {
      return count;
    }
  };
}

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

Переменная count "запомнена" внутри замыкания и недоступна извне — это создаёт инкапсуляцию.

Практический пример: Кэширование результатов функции

function createMemoizedFunction(fn) {
  const cache = {}; // Приватный объект кэша
  
  return function memoized(...args) {
    const key = JSON.stringify(args);
    
    if (key in cache) {
      console.log('Возврат из кэша');
      return cache[key];
    }
    
    console.log('Вычисляем значение');
    const result = fn(...args);
    cache[key] = result;
    return result;
  };
}

const expensiveSum = (a, b) => {
  // Имитация дорогого вычисления
  for (let i = 0; i < 1000000000; i++) {}
  return a + b;
};

const memoizedSum = createMemoizedFunction(expensiveSum);
memoizedSum(2, 3); // Вычисляем значение
memoizedSum(2, 3); // Возврат из кэша

Backend пример: Управление подключением к БД

function createDatabaseConnection(connectionString) {
  let isConnected = false;
  let connection = null;
  
  return {
    async connect() {
      if (isConnected) {
        return connection;
      }
      
      connection = await db.connect(connectionString);
      isConnected = true;
      return connection;
    },
    
    async disconnect() {
      if (isConnected && connection) {
        await connection.close();
        isConnected = false;
      }
    },
    
    isReady() {
      return isConnected;
    }
  };
}

const dbConnection = createDatabaseConnection('postgresql://...');
await dbConnection.connect();

Пример с функцией-обработчиком (middleware)

function createAuthMiddleware(secret) {
  return (req, res, next) => {
    const token = req.headers.authorization;
    
    try {
      const decoded = jwt.verify(token, secret); // secret в замыкании
      req.user = decoded;
      next();
    } catch (error) {
      res.status(401).send('Unauthorized');
    }
  };
}

const authMiddleware = createAuthMiddleware(process.env.JWT_SECRET);
app.use(authMiddleware);

Когда использовать:

  • Инкапсуляция данных — скрыть приватные переменные от внешнего доступа
  • Фабрики функций — создание функций с предконфигурированным состоянием
  • Кэширование — сохранение состояния между вызовами
  • Обработчики событий — привязка контекста к функции

Замыкания — фундамент JavaScript и Node.js, правильное их использование делает код более безопасным и управляемым.