Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: React, useState, setInterval, closures, useRef

Как гарантировать использование актуального значения состояния внутри setInterval?

Вопрос проверяет понимание замыканий и работы хука useState в React при использовании setInterval.

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

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

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

Проблема с замыканиями в setInterval

Когда вы используете setInterval внутри useEffect, функция обратного вызова создает замыкание на переменную состояния, которая была актуальна на момент создания интервала. Это означает, что даже если состояние обновляется, интервал продолжает использовать старое значение.

Решение с функциональным обновлением

Самый простой способ — использовать функциональную форму setState, которая получает предыдущее состояние и возвращает новое:

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

useEffect(() => {
  const id = setInterval(() => {
    setCount(prev => prev + 1); // всегда использует актуальное значение
  }, 1000);
  return () => clearInterval(id);
}, []);

Решение с useRef

Другой подход — хранить актуальное значение в ref и читать его внутри интервала:

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

useEffect(() => {
  countRef.current = count;
}, [count]);

useEffect(() => {
  const id = setInterval(() => {
    console.log(countRef.current); // всегда актуально
  }, 1000);
  return () => clearInterval(id);
}, []);

Вывод

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#React

#useState

#setInterval

#closures

#useRef

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию