Uzávěry a okamžité volání funkcí v JavaScriptu

Jak již víte, je možné anonymní funkci zavolat okamžitě a výsledek její práce přiřadit nějaké proměnné:

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

console.log(result); // vypíše '!'

Funkci, která se volá okamžitě, se v takovém případě často bere do kulatých závorek, i když to není nutné. Dělá se to proto, aby bylo ihned vidět, že se funkce volá okamžitě:

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

console.log(result); // vypíše '!'

Nechť je nyní výsledkem okamžitě volané funkce anonymní funkce:

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

func(); // vypíše '!'

Udělejme to tak, aby vrácená funkce uchovávala v uzávěru proměnnou num:

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

Pokud přidáme ještě num++, stane se funkce func hotovým čítačem:

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

func(); // vypíše 1
func(); // vypíše 2
func(); // vypíše 3
func(); // vypíše 4
func(); // vypíše 5
Задание 1

Bez nahlížení do mého kódu samostatně implementujte stejný čítač.

Задание 2

Upravte činnost čítače tak, aby počítal do 5 a poté se počítání začalo znovu.