Счетчик на замыканиях в 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 будет возвращать новую функцию, у которой будет свое замыкание. To есть разные счетчики будут работать независимо:

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 для разных функций будет иметь разное значение!

To есть если мы вызовем функцию test два раза, то полученные из нее функции будут работать независимым образом и каждая из этих функций будет иметь свою независимую переменную num.

Задание 1

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

Задание 2

Пусть функция в замыкании хранит число 10. Сделайте так, чтобы каждый вызов функции уменьшал это число на 1 и выводил в консоль уменьшенное число.

Задание 3

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