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

Наконец-то получил правильное определение закрытия, вот определение

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

Рассмотрим приведенный ниже пример:

function counter(){
  let count = 0;
  
  return function increment(){
    return count++;
  }
}

В приведенном выше примере increment() обращается к данным внешней функции ( counter() ).

Согласно приведенному выше определению, функция increment() может получить доступ к значению счетчика из функции counter(), даже если она будет выполняться отдельно. Рассмотрим пример ниже

function counter(){
  let count = 0;
  
  return function increment(){
    return count++;
  }
}
var count = counter();
count() // 0
count() // 1 
count() // 2 
count() // 3

В приведенном выше примере var count = counter(); counter()функция вернет ссылку на внутреннюю функцию increment(); Внутренняя функция increment() увеличивает значение внешнего счетчика переменных на единицу.

Таким образом, при вызове внутренней функции многократное значение счетчика времени увеличивается на единицу каждый раз.

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

Закрытие полезно для сокрытия деталей реализации JavaScript. Его можно использовать для создания частной переменной/функции.

В следующем примере показано, как создать частную переменную или функции.

var cart = (function(){
  let count = 0;
  
  function update(val){
   count += val;
  }
  return {
    increment: function(){
      update(1)
    },
    decrement: function(){
      update(-1)
    },
    value: function(){
     return count;
    }
  }
})();
cart.increment();
cart.value(); // 1
cart.decrement();
cart.decrement();
cart.value(); // -1