Closure i izvlačenje funkcije na licu mesta u JavaScript-u

Kao što već znate, možete pozvati anonimnu funkciju na licu mesta i dodeliti rezultat njenog rada nekoj promenljivoj:

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

console.log(result); // ispisaće '!'

Funkciju koja se poziva na licu mesta, u takvim slučajevima, često stavljaju u obične zagrade, iako za to nema potrebe. To se radi da bi se odmah videlo da se funkcija poziva na licu mesta:

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

console.log(result); // ispisaće '!'

Neka sada rezultat funkcije pozvane na licu mesta bude anonimna funkcija:

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

func(); // ispisaće '!'

Učinimo da vraćena funkcija čuva u closure-u promenljivu num:

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

Ako dodamo još num++, onda će funkcija func postati gotov brojač:

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

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

Ne zagledavajući se u moj kod, samostalno realizujte isti takav brojač.

Задание 2

Modifikujte rad brojača tako da on broji do 5, a onda da se odbrojavanje ponovo započinje.