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