A closure is a function that references variables from its enclosing scope even after the function is executed. A coroutine is a subroutine that can suspend and resume execution at certain points, maintaining its context. Continuation-passing style transforms programs so functions never return, instead invoking continuations representing the rest of the computation.