Domknięcia i natychmiastowe wywołanie funkcji w JavaScript

Jak już wiesz, możesz wywołać anonimową funkcję natychmiast i przypisać wynik jej działania do jakiejś zmiennej:

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

console.log(result); // wyświetli '!'

Często funkcję wywoływaną natychmiast w takim przypadku umieszcza się w okrągłych nawiasach, chociaż nie jest to konieczne. Robi się to po to, aby od razu było widać, że funkcja jest wywoływana natychmiast:

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

console.log(result); // wyświetli '!'

Niech teraz wynikiem funkcji wywołanej natychmiast będzie funkcja anonimowa:

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

func(); // wyświetli '!'

Zróbmy tak, aby zwracana funkcja przechowywała w domknięciu zmienną num:

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

Jeśli dodamy jeszcze num++, to funkcja func stanie się gotowym licznikiem:

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

func(); //wyświetli 1
func(); //wyświetli 2
func(); //wyświetli 3
func(); //wyświetli 4
func(); //wyświetli 5
Задание 1

Nie podglądając mojego kodu, samodzielnie zaimplementuj taki sam licznik.

Задание 2

Zmodyfikuj działanie licznika tak, aby liczył do 5, a potem odliczanie zaczynało się od nowa.