JavaScript-də Qlobal Sayğış Dəyişəni
Gəlin <num dəyişənini funksiyaların xaricində elan edək,
beləliklə onu qlobal edək:
let num = 1; // qlobal dəyişən
function test() {
return function() {
console.log(num);
num++;
};
}
Bu halda, bütün qaytarılan funksiyalar bu qlobal dəyişəni dəyişdirəcək və sayğışlar artıq bir-birindən asılı olaraq işləyəcək:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // birinci sayğış
func1(); // 1 çap ediləcək
func1(); // 2 çap ediləcək
let func2 = test(); // ikinci sayğış
func2(); // 3 çap ediləcək
func2(); // 4 çap ediləcək
Bəs əvvəlki kodumuz niyə müstəqil sayğışlar yaradırdı? Bu kodu xatırladım:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Məsələ ondadır ki, <num dəyişəni - <test funksiyasının
daxilində lokal dəyişəndir. Buna görə də hər <test çağırışı
öz lokal dəyişənini yaradır.
Buna görə də qaytarılan funksiyalar hər biri <test funksiyasının
öz lokal dəyişəninə istinad edəcək. Məhz beləliklə müstəqillik təmin
olunur.
Əgər <num-i qlobal dəyişən etsək - bu da bir qapanış olacaq.
Sadəcə, qaytarılan funksiyaların leksik mühitləri eyni <num
dəyişəninə istinad edir - bu dəyişəndə olan hər hansı dəyişiklik
bütün funksiyalarda görünəcək.
Kodu işə salmadan müəyyən edin ki, konsola nə çap olunacaq:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Kodu işə salmadan müəyyən edin ki, konsola nə çap olunacaq:
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();
Kodu işə salmadan müəyyən edin ki, konsola nə çap olunacaq:
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();