В 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
, предоставляют единственный способ взаимодействия с балансом, гарантируя, что баланс не может быть случайно изменен извне.
Такое применение замыканий делает код более модульным, безопасным и поддерживаемым.