JavaScriptда Closureлар орқали ҳисоблагч

Келтирилган кодни қайта ёзайлик, ҳар чақирилган функция 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 чиқади

Хулоса, биз closureдан (аниқроги бизнинг функциямизнинг closureиданги num ўзгарувчисидан) фойдаланиб, функцияларни чақириш ҳисоблагчини амалга оширдик.

Эътибор беринг, test функциясини ҳар чақириш ўзининг closureи бўлган янги функцияни қайтаради. Яъни турли ҳисоблагчлар мустақил ишлайди:

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

Мустақил равишда, менинг кодимга қарамай, closureлар орқали ишлайдиган функцияни чақириш ҳисоблагчини амалга оширинг.

Задание 2

Функция closureда 10 сонини сақласин. Функциянинг ҳар бир чақирилиши ушбу сонни 1 га камайтириши ва камайган сонни консолга чиқариши учун қилинг.

Задание 3

Олдинги масалани моддификация қилинг, ҳисоб 0 га етгунгача бориб, кейин функциянинг ҳар бир кейинги чақирилиши консолга ҳисоб тугагани ҳақида хабар чиқарсин.