Domknięcie jest to zasięg stworzony przez funkcję wraz z otaczającym ją środowiskiem czyli zmiennymi oraz innymi funkcjami, które oddzielone są razem od reszty kodu.
let b = 99; // zmienna globalna b
function foo() {
let b = 10; // osobna zmienna lokalna b
console.log("b:" + b); // odwołanie się do b lokalnego
}
foo(); // b: 10
Funkcja foo ma swoje własne środowisko z zmienną b, która jest oddzielona od globalnej przestrzeni nazw, nazwa zmiennej się pokrywa więc wybrana zostanie lokalna zmienna o wartości 10 w console.log()
Funkcja foo jest domknięciem, bo tworzy oddzielne środowisko dla zawartych w niej zmiennych oraz wewnętrznych funkcji.
Kolejny przykład:
let b = 99;
function foo() {
let b = 10;
function bar() {
let a = 5;
console.log("a:" + a, "b:" + b);
}
return bar; // zwraca ciało funkcji,
} // nie wywołuje jej
// w show jest zwrócona referencja do bar
const show = foo();
// funkcję wywołujemy z ()
show(); // a:5 b:10 - wartość b jest znana z poprzedniego wywołania foo!
show(); // a:5 b:10 - nadal jest znana wartość b
Po zakończeniu działania foo() z lokalną zmienną b zwrócona została funkcja bar i przypisana do show. Wywołanie show ukazuje, że nadal funkcja ta ma dostęp do zmiennej b z zakończonej funkcji foo.
To są domknięcia, gdzie JavaScript zachowuje referencję do zmiennych/środowiska, które otaczały funkcję bar. Pamiętajmy że domknięcia czyli Scopes można obejrzeć korzystając z funkcji console.dir() co może pomóc w zrozumieniu tematu.
KW