Lekcje modułu (4/4)
Domknięcia i zakres
Domknięcie (closure) to funkcja, która „pamięta” zmienne ze scope'u (zasięgu), w którym została zdefiniowana, nawet po tym, jak ten scope został zakończony. Brzmi to jak magia, ale jest to bezpośrednia konsekwencja zasad dotyczących zasięgu zmiennych.
Łańcuch zasięgu (Scope chain)
Funkcja może odczytywać zmienne zadeklarowane na zewnątrz niej samej, wędrując w górę łańcucha zasięgu:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // legge dalla closure
}
moltiplicaPer10(3); // 30Fabryka funkcji (Factory)
Najbardziej typowy wzorzec: funkcja, która zwraca inną funkcję, „spersonalizowaną” za pomocą przekazanych parametrów.
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!'Każde wywołanie creaSaluto tworzy osobny scope z własną wartością prefisso.
Licznik z prywatnym stanem
Klasyczny przykład: domknięcie, które przechowuje licznik bez udostępniania go na zewnątrz.
function creaContatore() {
let n = 0;
return function () {
n++;
return n;
};
}
const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3
const c2 = creaContatore();
c2(); // 1 ← stato isolato!Zmienna n jest prywatna: nikt spoza domknięcia nie może jej odczytać ani zmodyfikować.
Spróbuj sam
Zaimplementuj fabrykę `makeCounter()`, która zwraca funkcję: każde wywołanie tej funkcji zwraca kolejną liczbę całkowitą, zaczynając od 1. Różne liczniki muszą być niezależne.
Pokaż wskazówkę
Zadeklaruj n za pomocą let wewnątrz makeCounter, a następnie zwróć funkcję wykonującą ++n.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Zaimplementuj `makeAdderWith(base)`, które zwraca funkcję: dla podanej liczby n zwraca base + n. Każdy sumator pamięta swoją własną bazę.
Pokaż wskazówkę
Zwróć funkcję strzałkową, która używa base z parametru zewnętrznego.
Rozwiązanie dostępne po 3 próbach