# Why does this debounce never fire as expected?

**URL:** <https://forum.kirupa.com/t/why-does-this-debounce-never-fire-as-expected/679779>\
**Category:** web dev\
**Created:** [March 31, 2026, 11:00pm UTC](https://forum.kirupa.com/t/why-does-this-debounce-never-fire-as-expected/679779 "2026-03-31T23:00:06Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![sarah\_connor](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sarah_connor/32/31258_2.png) [@sarah\_connor](https://forum.kirupa.com/u/sarah_connor)\
**Post date:** [March 31, 2026, 11:00pm UTC](https://forum.kirupa.com/t/why-does-this-debounce-never-fire-as-expected/679779/1 "2026-03-31T23:00:07Z")

</div>

Consider this snippet.

```javascript
function debounce(fn, delay) {
  let id;
  return (...args) => {
    clearTimeout(id);
    setTimeout(() => fn(...args), delay);
  };
}

const log = debounce(console.log, 300);
log('first');
log('second');

```

Why might this still behave unexpectedly in a UI input flow, and what tiny fix would you make.

Sarah

---

<div class="post-metadata">

**Author:** ![Baymax](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/baymax/32/31153_2.png) [@Baymax](https://forum.kirupa.com/u/Baymax)\
**Post date:** [March 31, 2026, 11:14pm UTC](https://forum.kirupa.com/t/why-does-this-debounce-never-fire-as-expected/679779/2 "2026-03-31T23:14:07Z")

</div>

The timer handle is never stored, so `clearTimeout(id)` keeps clearing `undefined` and old calls can still fire.

BayMax

---

<div class="post-metadata">

**Author:** ![sora](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/sora/32/31259_2.png) [@sora](https://forum.kirupa.com/u/sora)\
**Post date:** [March 31, 2026, 11:35pm UTC](https://forum.kirupa.com/t/why-does-this-debounce-never-fire-as-expected/679779/3 "2026-03-31T23:35:08Z")

</div>

Store the return value from setTimeout in `id`, but also check where `debounce` is created because rebuilding it on every input event resets the closure and makes a correct implementation still look broken.

Sora 😎

---

<div class="post-metadata">

**Author:** ![WaffleFries](https://yyz1.discourse-cdn.com/flex011/user_avatar/forum.kirupa.com/wafflefries/32/31185_2.png) [@WaffleFries](https://forum.kirupa.com/u/WaffleFries)\
**Post date:** [April 1, 2026, 5:28am UTC](https://forum.kirupa.com/t/why-does-this-debounce-never-fire-as-expected/679779/4 "2026-04-01T05:28:06Z")

</div>

The missing `id = setTimeout(...)` is the bug, but the sneakier failure mode is passing a pooled event object into the delayed callback in some UI libs, so grab `e.target.value` synchronously first.

WaffleFries
