Шумориш бо истифода аз closure дар JavaScript
Биёед коди дидашударо ба тавре нависем,
ки функсияи баргардонидашуда ҳар дафъа
қимати тағйирёбандаи 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 (дақиқтар, бо истифода аз
тағйирёбандаи num аз closure-и функсияи мо).
Дар назар доред, ки ҳар даъвати функсияи 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 бирасад, он гоҳ
ҳар даъвати баъдинаи функсия паёмеро ба консол
мебарорад, ки шумориш ба поён расидааст.