Փակումներով հաշվիչ JavaScript-ում

Եկեք վերագրենք մեր դիտարկած կոդն այնպես, որ վերադարձվող ֆունկցիան ամեն անգամ mեկով ավելացնի num փոփոխականի արժեքը.

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++; // ավելացնում ենք մեկը
  }
}

let func = test();

Ստացվում է, որ func ֆունկցիայի ամեն կանչ կonsole-ում կարտածի նոր արժեք.

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 թիվը: Կատարեք այնպես, որ ֆունկցիայի ամեն կանչ մեկով փոքրացնի այդ թիվը և արտածի փոքրացված թիվը կոնսոլում:

Задание 3

Փոփոխեք նախորդ խնդիրը այնպես, որ հաշվարկը հասնի մինչև 0, ապա ամեն հաջորդ ֆունկցիայի կանչը կոնսոլում արտածի հաղորդագրություն, որ հաշվարկն ավարտված է: