Variabile globale contatore in JavaScript
Portiamo la variabile num fuori dalle funzioni,
rendendola così globale:
let num = 1; // variabile globale
function test() {
return function() {
console.log(num);
num++;
};
}
In questo caso tutte le funzioni restituite modificheranno questa variabile globale e i contatori lavoreranno in modo dipendente l'uno dall'altro:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // primo contatore
func1(); // mostrerà 1
func1(); // mostrerà 2
let func2 = test(); // secondo contatore
func2(); // mostrerà 3
func2(); // mostrerà 4
Perché allora il nostro codice precedente creava contatori indipendenti? Ricordo questo codice:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Il fatto è che la variabile num è locale
all'interno della funzione test. Quindi ogni
chiamata a test genera la propria variabile
locale.
Pertanto, le funzioni restituite si riferiranno
ciascuna alla propria variabile locale della funzione
test. È proprio così che si ottiene l'indipendenza
del funzionamento.
Se si rende num una variabile globale
- questa sarà comunque una chiusura. Semplicemente gli ambienti
lessicali delle funzioni restituite si riferiscono
alla stessa variabile num - qualsiasi
modifica a questa variabile sarà visibile in
tutte le funzioni.
Determinate, senza eseguire il codice, cosa verrà visualizzato in console:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Determinate, senza eseguire il codice, cosa verrà visualizzato in console:
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();
Determinate, senza eseguire il codice, cosa verrà visualizzato in console:
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();