Closures und sofortiger Funktionsaufruf in JavaScript

Wie Sie bereits wissen, ist es möglich, eine anonyme Funktion sofort aufzurufen und das Ergebnis ihrer Arbeit einer Variablen zuzuweisen:

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

console.log(result); // gibt '!' aus

Oft wird die Funktion, die sofort aufgerufen wird, in solchen Fällen in runde Klammern gesetzt, obwohl dies nicht notwendig ist. Dies geschieht, um sofort erkennbar zu machen, dass die Funktion sofort aufgerufen wird:

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

console.log(result); // gibt '!' aus

Lassen Sie uns nun das Ergebnis der sofort aufgerufenen Funktion eine anonyme Funktion sein:

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

func(); // gibt '!' aus

Lassen Sie uns dies so ändern, dass die zurückgegebene Funktion die Variable num im Closure speichert:

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

Wenn man num++ hinzufügt, wird die Funktion func zu einem fertigen Zähler:

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

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

Ohne einen Blick in meinen Code zu werfen, implementieren Sie selbstständig einen solchen Zähler.

Задание 2

Modifizieren Sie die Funktionsweise des Zählers so, dass er bis 5 zählt und dann der Countdown von vorne beginnt.