Contador con cierres en JavaScript

Reescribamos el código que hemos visto para que la función devuelta incremente el valor de la variable num en uno cada vez:

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

let func = test();

Resulta que cada llamada a la función func mostrará en la consola un nuevo valor:

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

let func = test();

func(); //mostrará 1
func(); //mostrará 2
func(); //mostrará 3
func(); //mostrará 4
func(); //mostrará 5

Resulta que hemos implementado un contador de llamadas a funciones, usando un cierre (más precisamente, usando la variable num del cierre de nuestra función).

Tenga en cuenta que cada llamada a la función test devolverá una nueva función, que tendrá su propio cierre. Es decir, diferentes contadores funcionarán de forma independiente:

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

let func1 = test(); // primer contador
func1();  //mostrará 1
func1();  //mostrará 2

let func2 = test(); // segundo contador
func2();  //mostrará 1
func2();  //mostrará 2

¡Resulta que la misma variable num tendrá valores diferentes para diferentes funciones!

Es decir, si llamamos a la función test dos veces, entonces las funciones obtenidas de ella funcionarán de forma independiente y cada una de estas funciones tendrá su propia variable independiente num.

Задание 1

Por su cuenta, sin mirar mi código, implemente un contador de llamadas a funciones que funcione con cierres.

Задание 2

Que la función en el cierre almacene el número 10. Haga que cada llamada a la función reduzca este número en 1 y muestre en la consola el número reducido.

Задание 3

Modifique la tarea anterior para que la cuenta regresiva llegue a 0, y luego cada llamada posterior a la función muestre en la consola un mensaje indicando que la cuenta regresiva ha terminado.