Затварања (closure) и изазивање функције на месту у JavaScript-у

Као што већ знате, могуће је позвати анонимну функцију на месту и доделити резултат њеног рада некој променљивој:

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

console.log(result); // исписаће '!'

Често се функција која се позива на месту у таквом случају ставља у заграде, иако у томе нема потребе. То се ради да би било одмах видљиво да се функција позива на месту:

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

console.log(result); // исписаће '!'

Нека сада резултат функције позване на месту буде анонимна функција:

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

func(); // исписаће '!'

Хајде да уредимо тако да враћена функција чува у затварању променљиву num:

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

Ако се дода још num++, онда ће функција func постати готов бројач:

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

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

Не загледајући се у мој код, самостално имплементирајте исти таквог бројача.

Задание 2

Модификујте рад бројача тако да броји до 5, а затим се бројање поново започиње.