Čítač s uzávěry v JavaScriptu

Přepišme námi probíraný kód tak, aby vrácená funkce pokaždé zvýšila hodnotu proměnné num o jednu:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++; // přičteme jedničku
  }
}

let func = test();

Vyplývá z toho, že každé volání funkce func vypíše do konzole novou hodnotu:

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

let func = test();

func(); //vypíše 1
func(); //vypíše 2
func(); //vypíše 3
func(); //vypíše 4
func(); //vypíše 5

Vyšlo nám, že jsme implementovali čítač volání funkcí pomocí uzávěru (přesněji pomocí proměnné num z uzávěru naší funkce).

Mějte na paměti, že každé volání funkce test vrátí novou funkci, která bude mít svůj vlastní uzávěr. To znamená, že různé čítače budou pracovat nezávisle:

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

let func1 = test(); // první čítač
func1();  //vypíše 1
func1();  //vypíše 2

let func2 = test(); // druhý čítač
func2();  //vypíše 1
func2();  //vypíše 2

Vychází nám, že stejná proměnná num bude pro různé funkce mít různou hodnotu!

To znamená, že pokud funkci test zavoláme dvakrát, pak z ní získané funkce budou fungovat nezávisle a každá z těchto funkcí bude mít svou nezávislou proměnnou num.

Задание 1

Samostatně, bez nahlížení do mého kódu, implementujte čítač volání funkce, fungující na uzávěrech.

Задание 2

Nechť funkce v uzávěru uchovává číslo 10. Zařiďte, aby každé volání funkce snížilo toto číslo o 1 a vypisovalo do konzole snížené číslo.

Задание 3

Upravte předchozí úlohu tak, aby odpočet došel k 0, a poté každé další volání funkce vypisovalo do konzole zprávu, že odpočet byl ukončen.