Chiusure e Invocazione Immediata di Funzioni in JavaScript

Come già sapete, è possibile invocare una funzione anonima immediatamente e assegnare il risultato a una variabile:

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

console.log(result); // visualizzerà '!'

Spesso la funzione che viene invocata immediatamente, in tali casi, viene racchiusa tra parentesi tonde, anche se non è strettamente necessario. Questo si fa per rendere immediatamente evidente che la funzione viene invocata sul posto:

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

console.log(result); // visualizzerà '!'

Supponiamo ora che il risultato della funzione inviocata immediatamente sia un'altra funzione anonima:

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

func(); // visualizzerà '!'

Facciamo in modo che la funzione restituita conservi nella chiusura la variabile num:

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

Se aggiungiamo anche num++, allora la funzione func diventerà un contatore pronto all'uso:

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

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

Senza guardare il mio codice, implementate autonomamente un contatore simile.

Задание 2

Modificate il funzionamento del contatore in modo che conti fino a 5, e poi ricominci da capo.