Что такое замыкание (closure) в JavaScript?

Понимание замыканий (closures) в JavaScript

В JavaScript, замыкание (closure) имеет довольно специфическое значение. Это функция вместе со всеми внешними переменными, которые она задействует. Другими словами, замыкания - это своеобразная комбинация функции и лексического окружения, в котором эта функция была объявлена.

Приведем пример кода для более ясного представления:

function makeCounter() {
  let count = 0;

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

let counter = makeCounter();

console.log( counter() );  // 0
console.log( counter() );  // 1
console.log( counter() );  // 2

В указанном примере внутренняя анонимная функция (она возвращается функцией makeCounter) имеет доступ к внешней переменной count, даже когда внешняя функция завершена. Это идеальный пример замыкания.

Давайте разберем другой пример замыкания, который также иллюстрирует применение замыканий для создания объектов с частными членами (или скрытыми переменными):

function makeBankAccount(initialBalance) {
  let balance = initialBalance;

  return {
    deposit: function(amount) {
      balance += amount;
    },
    withdraw: function(amount) {
      if (balance - amount >= 0) {
        balance -= amount;
      } else {
        console.log("Insufficient balance");
      }
    },
    checkBalance: function() {
      console.log(balance);
    }
  };
}

let account = makeBankAccount(100);
account.deposit(50);
account.checkBalance(); // 150
account.withdraw(200);
account.checkBalance(); // Insufficient balance

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

Такое применение замыканий делает код более модульным, безопасным и поддерживаемым.

Related Questions

Считаете ли это полезным?