Sulkeumat ja välitön funktion kutsu JavaScriptissä

Kuten jo tiedät, nimetöntä funktiota voidaan kutsua välittömästi ja antaa sen toiminnan tulos jollekin muuttujalle:

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

console.log(result); // tulostaa '!'

Usein välittömästi kutsuttava funktio suljetaan tällöin pyöreisiin sulkeisiin, vaikka siihen ei ole varsinaista tarvetta. Tämä tehdään sen vuoksi, että on heti nähtävissä, että funktiota kutsutaan välittömästi:

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

console.log(result); // tulostaa '!'

Tehdään nyt niin, että välittömästi kutsutun funktion tuloksena on nimetön funktio:

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

func(); // tulostaa '!'

Tehdään nyt niin, että palautettu funktio säilyttää sulkeumassaan muuttujan num:

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

Jos lisätään vielä num++, niin funktio func muuttuu valmiiksi laskuriksi:

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

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

Älä katsomatta koodiini, toteuta vastaava laskuri itse.

Задание 2

Muokkaa laskurin toimintaa siten, että se laskee 5:een asti, minkä jälkeen laskeminen alkaa alusta.