Skaitiklis su uždariniais JavaScript

Perrašykime anksčiau nagrinėtą kodą taip, kad grąžinama funkcija kiekvieną kartą padidintų kintamojo num reikšmę vienetu:

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

let func = test();

Pasirodo, kad kiekvienas funkcijos func iškvietimas atspausdins konsolėje naują reikšmę:

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

let func = test();

func(); //atspausdins 1
func(); //atspausdins 2
func(); //atspausdins 3
func(); //atspausdins 4
func(); //atspausdins 5

Pasirodo, kad mes įgyvendinome funkcijų iškvietimų skaitiklį, naudodami uždarinį (tiksliau, naudodami kintamąjį num iš mūsų funkcijos uždarinio).

Turėkite omenyje, kad kiekvienas funkcijos test iškvietimas grąžins naują funkciją, kuri turės savo uždarinį. Tai reiškia, kad skirtingi skaitikliai veiks nepriklausomai:

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

let func1 = test(); // pirmasis skaitiklis
func1();  //atspausdins 1
func1();  //atspausdins 2

let func2 = test(); // antrasis skaitiklis
func2();  //atspausdins 1
func2();  //atspausdins 2

Pasirodo, kad tas pats kintamasis num skirtingoms funkcijoms turės skirtingą reikšmę!

Tai reiškia, kad jei mes iškviestume funkciją test du kartus, tai iš jos gautos funkcijos veiktų nepriklausomai ir kiekviena iš šių funkcijų turės savo nepriklausomą kintamąjį num.

Задание 1

Savarankiškai, nežiūrėdami į mano kodą, įgyvendinkite funkcijos iškvietimų skaitiklį, veikiantį naudojant uždarinius.

Задание 2

Tegul funkcija uždaryme saugo skaičių 10. Padarykite taip, kad kiekvienas funkcijos iškvietimas sumažintų šį skaičių 1 ir atspausdintų konsolėje sumažintą skaičių.

Задание 3

Modifikuokite ankstesnį uždavinį taip, kad atgalinis skaičiavimas pasiektų 0, o tada kiekvienas vėlesnis funkcijos iškvietimas atspausdintų konsolėje pranešimą, kad atgalinis skaičiavimas baigtas.