JavaScriptда Closureлар орқали ҳисоблагч
Келтирилган кодни қайта ёзайлик,
ҳар чақирилган функция num
ўзгарувчисининг қийматини биттага
ошириб борса:
function test() {
let num = 1;
return function() {
console.log(num);
num++; // биттани қўшамиз
}
}
let func = test();
Демак, func функциясини ҳар чақириш
консолга янги қийматни чиқаради:
function 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и бўлган янги функцияни қайтаради.
Яъни турли ҳисоблагчлар мустақил ишлайди:
function 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 ўзгарувчисига эга бўлади.
Мустақил равишда, менинг кодимга қарамай, closureлар орқали ишлайдиган функцияни чақириш ҳисоблагчини амалга оширинг.
Функция closureда 10 сонини сақласин.
Функциянинг ҳар бир чақирилиши ушбу сонни
1 га камайтириши ва камайган сонни
консолга чиқариши учун қилинг.
Олдинги масалани моддификация қилинг,
ҳисоб 0 га етгунгача бориб, кейин
функциянинг ҳар бир кейинги чақирилиши
консолга ҳисоб тугагани ҳақида хабар чиқарсин.