Заминания и извикване на функция на място в 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, а след това отброяването да започне отначало.