Globalna promenljiva brojača u JavaScript-u

Iznosimo promenljivu num van funkcija, čineći je time globalnom:

javascriptlet num = 1; // globalna promenljiva

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

U ovom slučaju sve vraćene funkcije će menjati ovu globalnu promenljivu i brojači će raditi zavisno jedan od drugog:

javascriptlet num = 1;

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

let func1 = test(); // prvi brojač
func1();  // ispisaće 1
func1();  // ispisaće 2

let func2 = test(); // drugi brojač
func2();  // ispisaće 3
func2();  // ispisaće 4

Zašto je onda naš prethodni kod pravio nezavisne brojače? Podsećam na ovaj kod:

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

Stvar je u tome što je promenljiva num - lokalna unutar funkcije test. Zato svaki poziv test stvara svoju lokalnu promenljivu.

Stoga će vraćene funkcije referisati svaka na svoju lokalnu promenljivu funkcije test. Upravo se tako postiže nezavisnost rada.

Ako se num napravi globalnom promenljivom - to će takođe biti zatvaranje. Samo što leksička okruženja vraćenih funkcija referišu na istu promenljivu num - bilo kakve promene ove promenljive videće se u svim funkcijama.

Задание 1

Odredite, bez pokretanja koda, šta će se ispisati u konzolu:

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

Odredite, bez pokretanja koda, šta će se ispisati u konzolu:

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

Odredite, bez pokretanja koda, šta će se ispisati u konzolu:

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();