2026-02-25 · JavaScript

Find and fix event listener memory leaks

A postmortem of a SPA tab that grew 40 MB every time it was reopened.

Introduction

Detached nodes, listeners holding closures, and timers that never cleared. We reproduce the leak in DevTools, measure it properly, and refactor the component so it disconnects cleanly.

Field notes

A few patterns we kept seeing while puttering around JavaScript problems:

  • The simple version survived every refactor; the clever version didn’t.
  • Documentation written during the work aged far better than documentation written after.
  • The second time a problem shows up, it is already a pattern — name it.

A checklist you can steal

  • The failure is reproducible with one command.
  • The fix has a test that fails without it.
  • Someone other than the author has run it on their machine.

Closing

Write the short version future-you will actually read. That is the whole trick.