Where are closures genuinely useful in JavaScript?
Closures are useful whenever you want a function to remember something without that something being visible to the rest of the program. Six patterns come up constantly.
Private state. A factory function keeps a variable in its own scope and hands back only the functions you are willing to expose. Nothing outside can read or change the state, and there is no way to bypass the checks you put in front of it.
Memoisation. A function that caches its results in a closure only does the expensive work once. The cache is private, so it cannot be corrupted from outside, and it is discarded when nothing holds the function any more.
Event handlers and callbacks. A handler needs to know which row, which item or which request it belongs to, and a closure is how you give it that context without inventing a global.
Module factories. A function that takes a configuration and returns a configured object is a closure, which is how you build testable, reusable modules.
Middleware and decorators. A wrapper function takes a function and returns a function that adds behaviour around it, and the added behaviour usually needs state of its own.
Currying and partial application. A function that takes some arguments and returns a function waiting for the rest is a closure over the arguments it already has.
The honest caveat is that closures are everywhere in JavaScript whether you notice them or not, so it is better to think of them as a tool than as a feature to use deliberately. The question is always whether the state you are keeping alive is worth keeping alive.