Closure in JavaScript

  • In JavaScript, closure is a powerful feature that allows a function to access variables that are defined outside of its scope. In other words, a closure gives you access to an outer function's scope from an inner function.
  • To understand closure, it's important to understand how JavaScript handles variable scoping. In JavaScript, variables declared with the keyword "var" are function-scoped, which means they are accessible only within the function in which they are defined. However, variables declared with "let" or "const" are block-scoped, which means they are accessible only within the block in which they are defined.
  • Now, let's take a look at an example of closure:


    function outerFunction() {
        const outerVariable = 'I am outside!';

        function innerFunction() {
            console.log(outerVariable);
        }

        return innerFunction;
    }

    const innerFunc = outerFunction();
    innerFunc(); // Output: I am outside!

  • In this example, we have an outer function called outerFunction that defines a variable called outerVariable and an inner function called innerFunction. outerFunction returns innerFunction, which is assigned to the variable innerFunc.
  • When we call innerFunc(), it outputs "I am outside!". This is possible because innerFunction has access to outerVariable through closure.
  • Here's how closure works in this example:
  • The outerFunction is executed and outerVariable is declared and assigned the value "I am outside!".
  • innerFunction is defined within outerFunction's scope, so it has access to outerVariable.
  • outerFunction returns innerFunction as a value, so innerFunc now references the innerFunction function object.
  • When innerFunc() is called, it executes innerFunction's code block, which includes a reference to outerVariable.
  • Since outerVariable is defined in outerFunction's scope, innerFunction is able to access it through closure.
  • In summary, closure is a powerful feature in JavaScript that allows a function to access variables outside of its own scope. This allows for greater flexibility and encapsulation in your code.

here's a beginner-friendly example of implementing closure in JavaScript:


    function greet(name) {
        const greeting = `Hello, ${name}!`;

        function sayGreeting() {
            console.log(greeting);
        }

        return sayGreeting;
    }

    const johnGreeting = greet('John');
    const maryGreeting = greet('Mary');

    johnGreeting(); // Output: Hello, John!
    maryGreeting(); // Output: Hello, Mary!

  • In this example, we have a greet function that takes a name argument and returns an inner function sayGreeting. The sayGreeting function logs a greeting message that includes the name argument passed to the outer greet function.
  • When we call greet('John'), it returns sayGreeting with greeting set to "Hello, John!". We then assign this function to johnGreeting. Similarly, calling greet('Mary') returns another instance of sayGreeting with greeting set to "Hello, Mary!", which we assign to maryGreeting.
  • When we call johnGreeting(), it logs "Hello, John!" to the console. This is possible because sayGreeting has access to the greeting variable declared in the outer greet function, thanks to closure. Similarly, calling maryGreeting() logs "Hello, Mary!".
  • This example demonstrates how closure can be used to create reusable functions that have access to variables defined in their parent functions. It also shows how closure allows us to create multiple instances of the same function with different variables bound to their scopes.

No comments:

Post a Comment