Globális számlálóváltozó JavaScriptben
Vegyük ki a num változót a függvényeken kívülre,
ezzel globálissá téve:
let num = 1; // globális változó
function test() {
return function() {
console.log(num);
num++;
};
}
Ebben az esetben minden visszaadott függvény módosítani fogja ezt a globális változót, és a számlálók már egymástól függően fognak működni:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // első számláló
func1(); // kiírja: 1
func1(); // kiírja: 2
let func2 = test(); // második számláló
func2(); // kiírja: 3
func2(); // kiírja: 4
Miért csinálták független számlálókat a korábbi kódjaink? Emlékeztetőül a kód:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Az a helyzet, hogy a num változó lokális
a test függvényen belül. Ezért a test
minden meghívása a saját lokális változóját hozza létre.
Ezért a visszaadott függvények mind a test
függvény saját lokális változójára fognak hivatkozni.
Pontosan így érhető el a független működés.
Ha a num változót globálissá tesszük,
az továbbra is zárás lesz. Csak a visszaadott függvények
lexikai környezetei ugyanarra a num változóra
fognak hivatkozni - a változóval kapcsolatos bármely
módosítás látható lesz minden függvényben.
Határozd meg, kód futtatása nélkül, mi jelenik meg a konzolon:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Határozd meg, kód futtatása nélkül, mi jelenik meg a konzolon:
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();
Határozd meg, kód futtatása nélkül, mi jelenik meg a konzolon:
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();