Brojač na zatvaranjima u JavaScript-u

Hajde da prepišemo kod koji smo razmotrili tako da vraćena funkcija svaki put uvećava vrednost promenljive num za jedan:

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

let func = test();

Ispostavlja se da će svaki poziv funkcije func ispisivati novu vrednost u konzolu:

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

let func = test();

func(); //ispisaće 1
func(); //ispisaće 2
func(); //ispisaće 3
func(); //ispisaće 4
func(); //ispisaće 5

Ispostavlja se da smo implementirali brojač poziva funkcija, koristeći zatvaranje (tačnije koristeći promenljivu num iz zatvaranja naše funkcije).

Imajte u vidu da će svaki poziv funkcije test vraćati novu funkciju, koja će imati svoje vlastito zatvaranje. To znači da će različiti brojači raditi nezavisno:

javascriptfunction test() {
  let num = 1;
  
  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 1
func2();  //ispisaće 2

Ispostavlja se da će ista promenljiva num za različite funkcije imati različitu vrednost!

To znači da ako pozovemo funkciju test dva puta, tada će funkcije dobijene iz nje raditi nezavisno i svaka od tih funkcija će imati svoju nezavisnu promenljivu num.

Задание 1

Samostalno, ne zagledajući se u moj kod, implementirajte brojač poziva funkcije, koji radi na zatvaranjima.

Задание 2

Neka funkcija u zatvaranju čuva broj 10. Uredite tako da svaki poziv funkcije smanji ovaj broj za 1 i ispiše u konzolu smanjeni broj.

Задание 3

Modifikujte prethodni zadatak tako da odbrojavanje stigne do 0, a zatim svaki svaki naredni poziv funkcije ispiše u konzolu poruku da je odbrojavanje završeno.