Witam.
Ćwiczę domknięcia w JavaScript i pojawiła mi się pewna wątpliwość. Myślę, że wiem jak to działa ale nie mam pewności czy aby na pewno, więc wolę zapytać.
Chodzi o rekurencję. W zwyczajnej funkcji rekurencyjnej nie ma wycieku pamięci o ile dodamy warunek przerwania rekurencji. Przykład:
function recursion(counter) {
counter++;
const a = counter;
console.log(a);
if(counter < 100) // Warunek kolejnego wywołania.
recursion(counter);
}
recursion(0);
W powyższym przykładzie przy kolejnych wywołaniach tworzone są na stosie kolejne zasięgi, w każdym z nich powstaje nowa lokalna zmienna "a" (przykrywając tą z poprzedniego zasięgu), wywoływana jest console.log() i sprawdzany jest warunek. Jak się spełni, to następuje kolejno powrót do poprzedniego zasięgu, a że nie ma więcej instrukcji to cofamy się do poprzedniego itd, aż wychodzimy z funkcji. Przy każdym takim cofnięciu się zmienna "a" (wraz ze wszystkim co byłoby obok niej utworzone) jest usuwana wraz z zasięgiem, dzięki czemu nie mamy wycieku pamięci.
Pytanie brzmi, czy w podobnym przykładzie, tyle, że z domknięciem działa to identycznie?
function myFunction() {
let a = 0;
function recursion() {
a++;
const b = a
console.log(b);
if(a < 100)
recursion();
}
return recursion;
}
const closure = myFunction();
closure();
Rozumiem to tak, że działa tak samo z tą różnicą, że funkcja closure() ma tą swoją "ukrytą" zmienną "a" w swoim kontekście wykonania. Ale przy powrocie w wywołań rekurencyjnych jest ona usuwana wraz z zasięgiem i z utworzoną w każdym wywołaniu lokalną zmienną "b". Jeżeli dobrze myślę, to proszę o potwierdzenie. A jeżeli gdzieś w moim rozumowaniu jest błąd, to byłbym bardzo wdzięczny za wyjaśnienie problemu.
Dziękuję i pozdrawiam.