JavaScriptda Global Hisoblagich Oʻzgaruvchisi
num oʻzgaruvchisini funksiyalardan tashqariga chiqaramiz,
shu bilan uni global qilamiz:
let num = 1; // global oʻzgaruvchi
function test() {
return function() {
console.log(num);
num++;
};
}
Bunda barcha qaytarilgan funksiyalar ushbu global oʻzgaruvchini oʻzgartiradi va hisoblagichlar bir-biriga bogʻliq boʻlib ishlaydi:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // birinchi hisoblagich
func1(); // 1 chiqadi
func1(); // 2 chiqadi
let func2 = test(); // ikkinchi hisoblagich
func2(); // 3 chiqadi
func2(); // 4 chiqadi
Nima uchun bizning oldingi kodimiz mustaqil hisoblagichlar yaratgan edi? Ushbu kodni eslaymiz:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Gap shundaki, num oʻzgaruvchisi test
funksiyasi ichida lokal oʻzgaruvchidir. Shuning uchun har bir
test chaqiruvi oʻzining lokal oʻzgaruvchisini yaratadi.
Demak, qaytarilgan funksiyalar test funksiyasining
har biriga oʻzining lokal oʻzgaruvchisiga murojat qiladi.
Ishlash mustaqilligi shu tarzda erishiladi.
Agar num ni global oʻzgaruvchi qiladigan boʻlsak -
bu ham yopilish boʻladi. Faqatgina qaytarilgan funksiyalarning
leksik muhitlari bir xil num oʻzgaruvchisiga murojat qiladi -
ushbu oʻzgaruvchidagi har qanday oʻzgarishlar barcha funksiyalarda
koʻrinadi.
Kodni ishlamasdan, konsolda nima chiqishini aniqlang:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Kodni ishlamasdan, konsolda nima chiqishini aniqlang:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test()();
let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();
Kodni ishlamasdan, konsolda nima chiqishini aniqlang:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test();
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();