Zaprtja in takojšnji klic funkcije v JavaScript

Kot že veste, je mogoče anonimno funkcijo poklicati na mestu in rezultat njenega delovanja dodeliti neki spremenljivki:

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

console.log(result); // izpiše '!'

Funkcijo, ki se kliče na mestu, v takšnem primeru pogosto postavijo v okrogle oklepaje, čeprav temu ni nujno potrebe. To storijo zato, da je takoj videti, da se funkcija kliče na mestu:

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

console.log(result); // izpiše '!'

Naj bo zdaj rezultat takoj poklicane funkcije anonimna funkcija:

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

func(); // izpiše '!'

Naredimo tako, da vrnjena funkcija v zaprtju hrani spremenljivko num:

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

Če dodamo še num++, bo funkcija func postal končen števec:

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

func(); // izpiše 1
func(); // izpiše 2
func(); // izpiše 3
func(); // izpiše 4
func(); // izpiše 5
Задание 1

Ne zaganjajoč se v mojo kodo, samostojno implementirajte takšen števec.

Задание 2

Modificirajte delovanje števca tako, da šteje do 5, nato pa se odštevanje začne znova.