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: 10Funkcja 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ść bPo 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
