Модульні уроки (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, вона повертає base + n. Кожен суматор запам'ятовує свою базу.
Показати підказку
повертає функцію зі стрілкою, яка використовує основу із зовнішнього параметра.
Рішення доступне після 3 спроб