Уроки модуля (4/4)
Замыкания и область действия
Замыкание — это функция, которая "запоминает" переменные области, в которой она была определена. даже после того, как эта область действия закончилась. Это похоже на волшебство, но это прямое следствие правил области видимости.
Цепочка прицелов
Функция может читать переменные, объявленные вне самой себя, поднимаясь по цепочке областей видимости:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30Фабрика функций
Самый типичный шаблон: функция, которая возвращает другую функцию, «настроенную» с помощью параметры, которые он получил.
function creaSaluto(prefisso) {
return function (nome) {
return `${prefisso}, ${nome}!`;
};
}
const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');
ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'Каждый вызов creaSaluto создает отдельную область со своей собственной prefisso.
Счетчик с частным состоянием
Классический пример: закрытие, которое удерживает счетчик, не выставляя его наружу.
function creaContatore() {
let n = 0;
return function () {
n++;
return n;
};
}
const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3
const c2 = creaContatore();
c2(); // 1 ← isolated state!n является частным: никто за пределами замыкания не может его прочитать или изменить.
Попробуйте это
Реализуйте фабрику makeCounter(), которая возвращает функцию: каждый вызов функции возвращает прогрессивное целое число, начиная с 1. Различные счетчики должны быть независимыми.
Показать подсказку
Объявите n с помощью let внутри makeCounter, а затем верните функцию, которая выполняет ++n.
Решение доступно после 3 попыток
Обзор упражнения
Реализуйте makeAdderWith(base)`, которая возвращает функцию: по заданному числу n она возвращает основание + n. Каждый сумматор запоминает свою базу.
Показать подсказку
вернуть стрелочную функцию, которая использует базу из внешнего параметра.
Решение доступно после 3 попыток