Przejdź do głównej treści
eLearner.app
Moduł 4 · Lekcja 4 z 416/32 w kursie~12 min
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:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // legge dalla closure
}

moltiplicaPer10(3); // 30

Fabryka funkcji (Factory)

Najbardziej typowy wzorzec: funkcja, która zwraca inną funkcję, „spersonalizowaną” za pomocą przekazanych parametrów.

JS
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.

JS
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

Ćwiczenie#js.m4.l4.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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

Ćwiczenie#js.m4.l4.e2
Próby: 0Ładowanie...

Zaimplementuj `makeAdderWith(base)`, które zwraca funkcję: dla podanej liczby n zwraca base + n. Każdy sumator pamięta swoją własną bazę.

Ładowanie edytora...
Pokaż wskazówkę

Zwróć funkcję strzałkową, która używa base z parametru zewnętrznego.

Rozwiązanie dostępne po 3 próbach