Закрытие — простая вещь, но кажется очень сложной для понимания. Мы все использовали их, даже не зная о них. Замыкания очень тесно связаны с лексической областью действия.

Я рекомендую вам просмотреть мои более ранние истории о Контексте выполнения и Областях и цепочке областей действия, прежде чем читать это.

Всякий раз, когда вы создаете функцию внутри другой функции, вы создаете замыкание. И эта внутренняя функция — замыкание.

Закрытие полезно, когда мы определяем функцию внутри одной области видимости и используем ее в какой-то другой области видимости, а там она недоступна. С помощью закрытия мы делаем это возможным.

Замыкания содержат свою собственную цепочку областей видимости, цепочку областей видимости своих родителей и глобальную область видимости. Он также может получить доступ к переменным своей внешней функции даже после возврата функции.

function parent () { 
 const name = 'Aastha'   \\ Closure    
  function child() {     
   console.log(name)  
  }    
  return child
 }  parent()() // Aastha A way of calling a closure

Другой способ, присвоив возвращаемую функцию переменной и вызвав ее позже.

function parent() {
    name = 'Aastha';
    return function () {
        console.log(name);
    }
}
parent(); // this will be invoked
// the returned function gets saved in closurecall variable.
closurecall = parent();
 // calling closurecall will give the returned function from the parent() function
closurecall(); // 'Aastha'

Замыкание также может получить доступ к переменным внешней функции даже после возврата функции. Это позволяет возвращаемой функции поддерживать доступ к внешней функции.

Когда вы возвращаете внутреннюю функцию из функции, эта возвращаемая функция не будет вызываться при попытке вызвать внешнюю функцию. мы сначала сохраняем вызов внешней функции в отдельной переменной, а затем вызываем переменную как функцию.

Другой пример с передачей аргумента для функции возврата

function parent() {
    name = 'Aastha';
    return function (value) {
        console.log(name + value);
    }
}
parent(); // this will be invoked
// the returned function gets saved in closurecall variable.
closurecall = parent();
 // calling closurecall will give the returned function from the parent() function
closurecall('Gupta); // Aastha Gupta