JavaScript closures give functions memory: private state without globals, safer APIs, and predictable behavior. See what they are, when to use them, and why.
Martin Ferret
September 8, 2025
A closure is a function that keeps access to the variables from the place it was created, even after that outer function has finished. It’s the simplest way to give code “memory” without classes or globals.
Below is a small, practical example. We’ll keep the function as-is, then walk through exactly what happens line by line and why this pattern is useful in real projects.
function createCounter(initialCount = 0) {
let count = initialCount;
return function next() {
count++;
return count;
};
}
const getNextCount = createCounter(10);
console.log(getNextCount()); // 11
console.log(getNextCount()); // 12
console.log(getNextCount()); // 13
createCounter(10)
. Inside that call, JavaScript creates a new lexical environment where count
is set to 10
.createCounter
returns the inner function next
. Crucially, next
is closed over the environment where count
lives. Returning the function does not discard that environment; it stays alive because next
still references it.getNextCount
. Now, each call to getNextCount()
runs next()
, which reads and updates the same hidden count
variable: 11
, 12
, 13
, and so on.count
directly (count
is not a property on getNextCount
), which means the state is private by construction. When nothing references getNextCount
anymore, the closure (and its environment) can be garbage-collected.That’s a closure in action: function + remembered context.
getNextCount()
and nothing else; internals remain hidden.createCounter(0)
, createCounter(100)
) with zero risk of them interfering.Use a closure whenever logic must remember something across calls but you don’t want to expose that state:
Closures capture references to variables, not copies. Avoid capturing large objects you don’t need, and clean up listeners or timers that close over data when you’re done.
Get the latest news and updates on developer certifications. Content is updated regularly, so please make sure to bookmark this page or sign up to get the latest content directly in your inbox.
React Frameworks and Server-Side Features: Beyond Client-Side Rendering
Learn React's server-side features: SSR with streaming, static pre-rendering, hydration, Server Components, and Server Functions. Discover how frameworks like Next.js enable modern full-stack React development.
Aurora Scharff
Oct 1, 2025
Promises in JavaScript: Receipts for Future Values and Advanced Patterns
JavaScript Promises manage future values with clean async handling. Learn how Promise.all, race, allSettled, and any simplify parallel tasks, timeouts, and error management.
Martin Ferret
Sep 30, 2025
Vue's Magical Reactivity Has Some Quirks
Why does Vue's reactivity sometimes behave unexpectedly? Explore ref unwrapping edge cases and cloning complications with clear examples and fixes.
Abdel Awad
Sep 30, 2025
We can help you recruit Certified Developers for your organization or project. The team has helped many customers employ suitable resources from a pool of 100s of qualified Developers.
Let us help you get the resources you need.