Understanding Closure and Lexical Scope in JavaScript

ZainDev
3 min readSep 27, 2023

JavaScript is a versatile and widely-used programming language known for its ability to create dynamic and interactive web applications. To truly master JavaScript, one must have a firm grasp of some of its more advanced concepts, including closures and lexical scope. In this article, we’ll explore these topics in a beginner-friendly manner, complete with practical examples to help you understand their significance.

What is Lexical Scope?

Let’s start with the concept of lexical scope. Lexical scope, also known as static scope, refers to how variable access is determined at the time of writing the code, based on the physical placement of variables and functions in the code. In simpler terms, lexical scope is all about where a variable or function is declared within your code.

Consider the following example:

function outer() {
const message = "Hello, ";

function inner(name) {
console.log(message + name);
}

return inner;
}

const greet = outer();
greet("Alice"); // Outputs: Hello, Alice

In this code, the outer function defines a variable called message and an inner function inner. When the outer function is invoked, it returns the inner function. Subsequently, we assign the returned inner function to the greet variable and then call greet("Alice").

The important thing to note here is that the inner function has access to the message variable, even though it's declared in the outer function. This is because JavaScript uses lexical scoping, meaning it looks for variables in the scope where the function was defined, not where it was called. In this case, inner has access to message because it's lexically scoped within outer.

What is a Closure?

A closure is closely related to lexical scope. It occurs when a function “remembers” the variables from its outer lexical scope, even after that outer function has finished executing. This behavior allows functions to maintain access to their parent’s variables, even if they would normally go out of scope.

Let’s see a closure in action:

function createCounter() {
let count = 0;

return function() {
return ++count;
};
}

const counter = createCounter();

console.log(counter()); // Outputs: 1
console.log(counter()); // Outputs: 2

In this example, the createCounter function returns an anonymous function. This returned function forms a closure over the count variable declared in its outer scope. Every time we call counter(), it increments and returns the count variable, which persists between function calls because of the closure.

Why are Closures Important?

Closures are a powerful tool in JavaScript and have many practical uses. They are often used for data encapsulation, emulating private variables, and creating factory functions.

Here’s an example of using closures to create a private counter:

function createPrivateCounter() {
let count = 0;

return {
increment: function() {
return ++count;
},
get: function() {
return count;
},
};
}

const privateCounter = createPrivateCounter();

console.log(privateCounter.increment()); // Outputs: 1
console.log(privateCounter.increment()); // Outputs: 2
console.log(privateCounter.get()); // Outputs: 2

In this code, the createPrivateCounter function returns an object with two methods, increment and get. These methods can access and modify the count variable because of the closure, effectively creating a private counter that cannot be accessed from outside the object.

Conclusion

Understanding lexical scope and closures is essential for becoming proficient in JavaScript. Lexical scope determines variable access based on where they are defined in the code, while closures allow functions to “remember” variables from their parent’s scope, even after the parent function has finished executing. Closures are powerful tools that enable data encapsulation and the creation of private variables, among other things.

As you continue your journey in JavaScript, remember that practice and experimentation are key to mastering these concepts. The more you work with closures and lexical scope, the more you’ll appreciate their utility and versatility in your JavaScript projects. Happy coding!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

ZainDev
ZainDev

Written by ZainDev

Software Engineer - Senior Full Stack Developer (Tech and Project Lead) ✓Angular ✓React ✓Next ✓Node ✓WebSocket ✓JavaScript ✓TypeScript

No responses yet

Write a response