JavaScript closures are functions that access variables from their outer lexical environment. For a function to use external data, the interpreter creates a closure to store these free variables in the heap, allowing access even after the outer function has finished. Unlike pure functions, closures retain data indefinitely until garbage collected. They enable data encapsulation by keeping state private within the inner function. Closures are also useful for callback-based APIs, such as creating function factories that return new functions based on arguments.