JavaScript runs on a single thread. If you wait for a slow operation (network request, file read), everything freezes. Users hate frozen interfaces.
Asynchronous code lets slow operations run in the background. Your program continues while waiting. When the operation finishes, a callback handles the result. This keeps your app responsive.