Callbacks and Callback Hell
Passing a function to be executed later, and why deeply nested callbacks became a maintainability problem promises and async/await later solved.
A callback is simply a function passed as an argument to another function, intended to be invoked at some later point — either synchronously (like in array.forEach(callback)) or asynchronously (like in setTimeout(callback, 1000) or a network request's completion handler). Callbacks were JavaScript's original mechanism for asynchronous programming, and while they've been largely superseded by promises and async/await for async work, understanding them is essential since so many APIs (event listeners, array methods) still use the callback pattern directly.
A callback is like leaving your phone number with a restaurant host and going to wait at the bar — instead of standing in line asking 'is my table ready?' over and over (blocking), you get called back the moment it's ready, and can drink at the bar in the meantime (non-blocking).