Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: setInterval, useEffect, cleanup function, React hooks, memory leak

Какие проблемы могут возникнуть при работе с setInterval в useEffect?

Этот вопрос проверяет понимание особенностей работы setInterval в React-компонентах и помогает избежать распространённых ошибок с таймерами и утечками памяти.

Короткий ответ

При использовании setInterval в useEffect без очистки (cleanup) интервал продолжит выполняться после размонтирования компонента, что может вызвать утечку памяти и ошибки при обращении к состоянию несуществующего компонента. Также важно правильно указывать зависимости в массиве зависимостей useEffect, чтобы интервал не пересоздавался при каждом рендере. Для работы с актуальным состоянием внутри setInterval нужно использовать рефы или функциональную форму обновления состояния.

Длинный ответ

Использование setInterval внутри useEffect в React требует особого внимания к жизненному циклу компонента и управлению побочными эффектами. Основная сложность заключается в том, что интервал продолжает выполняться в фоновом режиме, даже если компонент, который его создал, был удалён с экрана (размонтирован).

Основные проблемы

  • Утечка памяти: Если не остановить интервал при размонтировании компонента, он продолжит работать, занимая ресурсы и потенциально вызывая утечку памяти.
  • Обращение к неактуальному состоянию: Колбэк, переданный в setInterval, "захватывает" значения переменных (включая состояние) на момент создания интервала. Это означает, что внутри интервала вы будете работать со старыми (замыкающими) значениями, а не с актуальными.
  • Неконтролируемое создание интервалов: Если забыть указать пустой массив зависимостей [] в useEffect, хук будет выполняться при каждом рендере, создавая новые интервалы, что быстро приведёт к падению производительности.

Правильный паттерн с очисткой

Ключевое правило — всегда возвращать функцию очистки (cleanup function) из useEffect. Эта функция выполнится перед размонтированием компонента или перед следующим вызовом эффекта.

useEffect(() => {
  const intervalId = setInterval(() => {
    console.log('Таймер сработал');
  }, 1000);

  // Функция очистки
  return () => {
    clearInterval(intervalId);
  };
}, []); // Пустой массив зависимостей = эффект только при монтировании

Работа с актуальным состоянием

Чтобы внутри интервала иметь доступ к последнему значению состояния, можно использовать реф (useRef) или функциональную форму обновления состояния (setState(prev => prev + 1)). Функциональная форма гарантирует, что вы работаете с актуальным предыдущим значением, которое React передаёт в функцию-обновление.

const [count, setCount] = useState(0);

useEffect(() => {
  const intervalId = setInterval(() => {
    // Используем функциональное обновление для получения актуального count
    setCount(prevCount => prevCount + 1);
  }, 1000);

  return () => clearInterval(intervalId);
}, []);

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

Вывод: Всегда очищайте интервалы в функции очистки useEffect и используйте функциональные обновления состояния или рефы для работы с актуальными данными. Этот паттерн необходим для создания надёжных React-компонентов с таймерами, избегая утечек памяти и неожиданного поведения.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#setInterval

#useEffect

#cleanup function

#React hooks

#memory leak

Подпишись на React Developer в телеграм