Бројач на затворања во JavaScript

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

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++; // додаваме еден
  }
}

let func = test();

Ќе испадне дека секој повик на функцијата func ќе испишува нова вредност во конзола:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  }
}

let func = test();

func(); //ќе испише 1
func(); //ќе испише 2
func(); //ќе испише 3
func(); //ќе испише 4
func(); //ќе испише 5

Излегува дека имплементиравме бројач на повици на функции, користејќи затворање (поточно користејќи променлива num од затворањето на нашата функција).

Имајте на ум дека секој повик на функцијата test ќе враќа нова функција, која ќе има свое затворање. Тоа значи дека различни бројачи ќе работат независно:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  };
}

let func1 = test(); // прв бројач
func1();  //ќе испише 1
func1();  //ќе испише 2

let func2 = test(); // втор бројач
func2();  //ќе испише 1
func2();  //ќе испише 2

Излегува дека истата променлива num за различни функции ќе има различна вредност!

Тоа значи дека ако ја повикаме функцијата test два пати, тогаш добиените од неа функции ќе работат независно и секоја од овие функции ќе има своја независна променлива num.

Задание 1

Самостојно, без да го погледнувате мојот код, имплементирајте бројач на повик на функција, кој работи на затворања.

Задание 2

Нека функцијата во затворањето чува број 10. Направете така што секој повик на функцијата ќе го намалува овој број за 1 и ќе ја прикажува намалената вредност во конзола.

Задание 3

Модифицирајте ја претходната задача така што одбројувањето ќе стигне до 0, а потоа секој нареден повик на функцијата ќе испишува во конзола порака дека одбројувањето е завршено.