Замыкание (closure) — это функция или объект, которые «захватывают» переменные из своего внешнего контекста. Это позволяет функции использовать и изменять эти переменные даже после того, как контекст, в котором они были объявлены, вышел из области видимости. Замыкания широко используются для создания функций обратного вызова (callback), а также для реализации инкапсуляции и управления состоянием.
Пример на JavaScript:
function makeCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
В этом примере функция makeCounter
создает и возвращает внутреннюю функцию, которая увеличивает и возвращает значение переменной count
. Переменная count
сохраняется в замыкании и доступна внутренней функции даже после завершения выполнения makeCounter
.
Применение замыканий:
- Создание приватных переменных: Замыкания позволяют создавать функции с приватными переменными, которые недоступны из внешнего контекста.
function createPerson(name) {
return {
getName: function() {
return name;
},
setName: function(newName) {
name = newName;
}
};
}
const person = createPerson('Alice');
console.log(person.getName()); // Alice
person.setName('Bob');
console.log(person.getName()); // Bob
- Функции обратного вызова (callbacks): Замыкания часто используются для создания функций обратного вызова, которые сохраняют контекст выполнения.
function delayedGreeting(name) {
setTimeout(function() {
console.log(`Hello, ${name}!`);
}, 1000);
}
delayedGreeting('Alice'); // Через 1 секунду: Hello, Alice!
- Мемоизация: Замыкания позволяют запоминать результаты вычислений для повышения производительности.
function memoize(fn) {
const cache = {};
return function(arg) {
if (cache[arg]) {
return cache[arg];
} else {
const result = fn(arg);
cache[arg] = result;
return result;
}
};
}
const factorial = memoize(function(n) {
return n <= 1 ? 1 : n * factorial(n - 1);
});
console.log(factorial(5)); // 120
Замыкания — это мощный инструмент, который делает код более гибким и управляемым.