JavaScriptтеги глобалдык өзгөрмө санагычы
Өзгөрмөнү num функциялардын сыртына чыгарып,
аны глобалдык кылабыз:
javascriptlet num = 1; // глобалдык өзгөрмө
function test() {
return function() {
console.log(num);
num++;
};
}
Бул учурда кайтарылган бардык функциялар ушул глобалдык өзгөрмөнү өзгөртөт жана санагычтар бир-бирине көз каранды иштей баштайт:
javascriptlet num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // биринчи санагыч
func1(); // 1 чыгарат
func1(); // 2 чыгарат
let func2 = test(); // экинчи санагыч
func2(); // 3 чыгарат
func2(); // 4 чыгарат
Биздин мурунку код эмне үчүн көз карандысыз санагычтарды түзгөн? Бул кодду эске туталы:
javascriptfunction test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Иши ушунда, num өзгөрмөсү - test
функциясынын ичиндеги локалдуу өзгөрмө. Ошондуктан
ар бир test чакыруу өзүнүн локалдуу
өзгөрмөсүн түзөт.
Демек, кайтарылган функциялар ар бири
test функциясынын өзүнүн локалдуу өзгөрмөсүнө
шилтейт. Дали ушундай жол менен иштөөнүн
көз карандысыздыгына жетишебиз.
Эгерде num глобалдык өзгөрмө кылса
- бул дагы жабылуу болот. Жөн гана кайтарылган
функциялардын лексикалык чөйрөлөрү бир эле
num өзгөрмөсүнө шилтейт - бул өзгөрмөдөгү
каалаган өзгөртүүлөр бардык функцияларда
көрүнөт.
Кодду иштетпестен, консолго эмне чыгарыларын аныктаңыз:
javascriptlet counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Кодду иштетпестен, консолго эмне чыгарыларын аныктаңыз:
javascriptfunction 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();
Кодду иштетпестен, консолго эмне чыгарыларын аныктаңыз:
javascriptfunction 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();