Skip to content

Ошибка в статье "Debounce на примере формы поиска" #5985

@VlaSapRos

Description

@VlaSapRos

Ссылка на статью

https://doka.guide/js/debounce/

Описание

Код в блоке "Пишем debounce()" записывает временную метку и таймаут в объект window, а это уже общее изменяемое состояние (shared mutable state), что может стать причиной ошибок конкурентности (race conditions). Лучше использовать замыкание как в доработанном примере ниже

function debounce(callee, timeoutMs) {
  let lastCall
  let lastCallTimer
  return function perform(...args) {
    const now = Date.now()

    if (lastCall && now - lastCall <= timeoutMs) {
      clearTimeout(lastCallTimer)
    }

    lastCallTimer = setTimeout(() => callee(...args), timeoutMs)
  }
}

Пруфы

function debounce(callee, timeoutMs) {
  return function perform(...args) {
    let previousCall = this.lastCall

    this.lastCall = Date.now()

    if (previousCall && this.lastCall - previousCall <= timeoutMs) {
      clearTimeout(this.lastCallTimer)
    }

    this.lastCallTimer = setTimeout(() => callee(...args), timeoutMs)
  }
}

Ссылка на блок с ошибкой https://doka.guide/js/debounce/#pishem-debounce

2026-04-07.13.34.02.mov

Metadata

Metadata

Assignees

No one assigned

    Labels

    jsКонтент по JavaScriptошибкаЧто-то критичное и мешает

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions