Globale Zählervariable in JavaScript
Wir setzen die Variable num außerhalb der Funktionen,
damit sie global wird:
let num = 1; // globale Variable
function test() {
return function() {
console.log(num);
num++;
};
}
In diesem Fall ändern alle zurückgegebenen Funktionen diese globale Variable, und die Zähler werden voneinander abhängig arbeiten:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // erster Zähler
func1(); // gibt 1 aus
func1(); // gibt 2 aus
let func2 = test(); // zweiter Zähler
func2(); // gibt 3 aus
func2(); // gibt 4 aus
Warum hat unser vorheriger Code unabhängige Zähler erstellt? Ich erinnere an diesen Code:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Die Sache ist, dass die Variable num lokal
innerhalb der Funktion test ist. Daher erzeugt jeder
Aufruf von test seine eigene lokale
Variable.
Daher werden die zurückgegebenen Funktionen
jede auf ihre eigene lokale Variable der Funktion
test verweisen. Genau so wird die Unabhängigkeit
der Arbeit erreicht.
Wenn man num jedoch zu einer globalen Variable macht
- ist das auch ein Closure. Einfach die lexikalischen
Umgebungen der zurückgegebenen Funktionen verweisen
auf dieselbe Variable num - alle
Änderungen an dieser Variable sind in
allen Funktionen sichtbar.
Bestimmen Sie, ohne den Code auszuführen, was in der Konsole ausgegeben wird:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Bestimmen Sie, ohne den Code auszuführen, was in der Konsole ausgegeben wird:
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();
Bestimmen Sie, ohne den Code auszuführen, was in der Konsole ausgegeben wird:
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();