Cierres y llamada de función inmediata en JavaScript

Como ya sabes, es posible llamar una función anónima inmediatamente y asignar el resultado a alguna variable:

javascriptlet result = function() {
  return '!';
}();

console.log(result); // mostrará '!'

A menudo, la función que se llama inmediatamente se encierra entre paréntesis, aunque no es necesario. Esto se hace para que sea inmediatamente evidente que la función se llama en el lugar:

javascriptlet result = (function() {
  return '!';
})();

console.log(result); // mostrará '!'

Hagamos ahora que el resultado de la función invocada inmediatamente sea una función anónima:

javascriptlet func = (function() {
  return function() {
    console.log('!');
  }
})();

func(); // mostrará '!'

Hagamos que la función devuelta almacene en el cierre la variable num:

javascriptlet func = (function() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
})();

Si agregamos también num++, la función func se convertirá en un contador listo:

javascriptlet func = (function() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  }
})();

func(); // mostrará 1
func(); // mostrará 2
func(); // mostrará 3
func(); // mostrará 4
func(); // mostrará 5
Задание 1

Sin mirar mi código, implemente usted mismo un contador similar.

Задание 2

Modifique el funcionamiento del contador para que cuente hasta 5, y luego la cuenta comience de nuevo.