Globalna zmienna licznika w JavaScript

Wynieśmy zmienną num poza funkcje, tym samym czyniąc ją globalną:

javascriptlet num = 1; // zmienna globalna

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

W tym przypadku wszystkie zwracane funkcje będą modyfikować tę globalną zmienną i liczniki będą już działać zależnie od siebie:

javascriptlet num = 1;

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

let func1 = test(); // pierwszy licznik
func1();  // wypisze 1
func1();  // wypisze 2

let func2 = test(); // drugi licznik
func2();  // wypisze 3
func2();  // wypisze 4

Dlaczego więc nasz poprzedni kod tworzył niezależne liczniki? Przypomnę ten kod:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  };
};

Chodzi o to, że zmienna num jest lokalna wewnątrz funkcji test. Dlatego każde wywołanie test tworzy swoją własną zmienną lokalną.

Dlatego zwracane funkcje będą odnosić się każda do swojej lokalnej zmiennej funkcji test. W ten sposób osiąga się niezależność działania.

Jeśli natomiast uczynimy num zmienną globalną - to również będzie domknięciem. Po prostu otoczenia leksykalne zwracanych funkcji odnoszą się do tej samej zmiennej num - jakiekolwiek zmiany tej zmiennej będą widoczne we wszystkich funkcjach.

Задание 1

Określ, bez uruchamiania kodu, co zostanie wypisane w konsoli:

javascriptlet counter = 0;
    
function test() {
  return function() {
    console.log(counter);
    counter++;
  };
}

let func = test;

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Задание 2

Określ, bez uruchamiania kodu, co zostanie wypisane w konsoli:

javascriptfunction test() {
  let counter = 0;
  
  return function() {
    return function() {
      console.log(counter);
      counter++;
    };
  };
}

let func = test()();

let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();
Задание 3

Określ, bez uruchamiania kodu, co zostanie wypisane w konsoli:

javascriptfunction test() {
  let counter = 0;
  
  return function() {
    return function() {
      console.log(counter);
      counter++;
    };
  };
}

let func = test();

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();