Închideri și autoapelarea funcțiilor în JavaScript

După cum știți deja, puteți apela o funcție anonimă imediat și puteți atribui rezultatul unei variabile:

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

console.log(result); // va afișa '!'

Deseori, funcția care se autoapelează este pusă între paranteze rotunde, deși acest lucru nu este obligatoriu. Acest lucru se face pentru a se vedea imediat că funcția este apelată imediat:

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

console.log(result); // va afișa '!'

Să presupunem acum că rezultatul funcției autoapelate este o funcție anonimă:

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

func(); // va afișa '!'

Să facem astfel încât funcția returnată să stocheze în închidere variabila num:

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

Dacă adăugăm num++, atunci funcția func va deveni un contor gata făcut:

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

func(); //va afișa 1
func(); //va afișa 2
func(); //va afișa 3
func(); //va afișa 4
func(); //va afișa 5
Задание 1

Fără a privi codul meu, implementați singuri un astfel de contor.

Задание 2

Modificați funcționarea contorului astfel încât acesta să numere până la 5, iar apoi numărătoarea să înceapă de la început.