Брояч със затваряния в JavaScript

Нека пренапишем разгледания код така, че върнатата функция всеки път да увеличава стойността на променливата num с единица:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++; // добавяме единица
  }
}

let func = test();

Получава се, че всяко извикване на функцията func ще извежда в конзолата нова стойност:

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

let func = test();

func(); // ще изведе 1
func(); // ще изведе 2
func(); // ще изведе 3
func(); // ще изведе 4
func(); // ще изведе 5

Получава се, че реализирахме брояч на извикванията на функции, използвайки затваряне (по-точно използвайки променливата num от затварянето на нашата функция).

Имайте предвид, че всяко извикване на функцията test ще връща нова функция, която ще има свое собствено затваряне. Тоест различни броячи ще работят независимо:

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

let func1 = test(); // първи брояч
func1();  // ще изведе 1
func1();  // ще изведе 2

let func2 = test(); // втори брояч
func2();  // ще изведе 1
func2();  // ще изведе 2

Получава се, че една и съща променлива num за различни функции ще има различна стойност!

Тоест, ако извикаме функцията test два пъти, то получените от нея функции ще работят независимо и всяка от тези функции ще има своя независима променлива num.

Задание 1

Самостоятелно, без да надничате в моя код, реализирайте брояч на извикванията на функция, работещ на затваряния.

Задание 2

Нека функцията в затварянето пази число 10. Направете така, че всяко извикване на функцията да намалява това число с 1 и да извежда в конзолата намаленото число.

Задание 3

Модифицирайте предходната задача така, че отброяването да стига до 0, а след това всяко последващо извикване на функцията да извежда в конзолата съобщение, че отброяването е приключило.