Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: handling, logging

В случае отслеживания курсора пользователя и логирования его координат, как можно оптимизировать вызов функции?

Этот вопрос проверяет знание техник оптимизации обработки частых и ресурсоемких событий, таких как движение мыши.

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

Для оптимизации логирования координат курсора можно использовать троттлинг (throttling) или дебаунсинг (debouncing). Троттлинг гарантирует, что функция будет вызываться не чаще, чем один раз в заданный промежуток времени (например, каждые 100мс), что идеально подходит для отслеживания непрерывного движения. Дебаунсинг откладывает вызов функции до тех пор, пока не пройдет пауза в событиях заданной длительности (например, 250мс), что лучше подходит для логирования конечной позиции курсора.

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

Событие mousemove срабатывает очень часто (десятки раз в секунду), что может создать избыточную нагрузку.

Throttling (Троттлинг)

Троттлинг ограничивает частоту выполнения функции. Он гарантирует, что функция будет выполняться не более одного раза в указанный период времени.

  • Принцип: "Вызывай функцию не чаще, чем раз в N миллисекунд".

  • Идеально для: Непрерывных потоков событий, где важна регулярность обновлений (например, перетаскивание элементов, отслеживание скролла, резизинг окна).

function throttle(func, delay) {
  let lastCall = 0;
  return function (...args) {
    const now = Date.now();
    if (now - lastCall < delay) {
      return; // Игнорируем вызов, если с прошлого вызова прошло мало времени
    }
    lastCall = now;
    return func.apply(this, args);
  };
}

const throttledLog = throttle((x, y) => {
  console.log(`Cursor at: ${x}, ${y}`);
}, 100); // Логируем максимум 10 раз в секунду

document.addEventListener('mousemove', (e) => {
  throttledLog(e.clientX, e.clientY);
});

Debouncing (Дебаунсинг)

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

  • Принцип: "Вызывай функцию только если после последнего события прошло N миллисекунд, и новых событий не было".

  • Идеально для: Сценариев, где важна только конечная точка после серии быстрых событий (например, поиск по вводу в поле, валидация формы, логирование окончания resize).

function debounce(func, delay) {
  let timeoutId;
  return function (...args) {
    clearTimeout(timeoutId); // Сбрасываем таймер при каждом новом событии
    timeoutId = setTimeout(() => {
      func.apply(this, args);
    }, delay);
  };
}

const debouncedLog = debounce((x, y) => {
  console.log(`Cursor finally at: ${x}, ${y}`); // Сработает после остановки курсора
}, 250);

document.addEventListener('mousemove', (e) => {
  debouncedLog(e.clientX, e.clientY);
});

Вывод: Для оптимизации отслеживания курсора используйте троттлинг, если вам нужны регулярные обновления координат во время движения. Используйте дебаунсинг, если вам важно залогировать позицию, в которой пользователь остановил курсор.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

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

#handling

#logging

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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