Variable globale de compteur en JavaScript
Déplaçons la variable num en dehors des fonctions,
la rendant ainsi globale :
let num = 1; // variable globale
function test() {
return function() {
console.log(num);
num++;
};
}
Dans ce cas, toutes les fonctions renvoyées modifieront cette variable globale et les compteurs fonctionneront de manière dépendante les uns des autres :
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // premier compteur
func1(); // affichera 1
func1(); // affichera 2
let func2 = test(); // deuxième compteur
func2(); // affichera 3
func2(); // affichera 4
Pourquoi notre code précédent créait-il des compteurs indépendants ? Je rappelle ce code :
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Le fait est que la variable num est locale
à l'intérieur de la fonction test. Par conséquent, chaque
appel de test génère sa propre variable
locale.
C'est pourquoi les fonctions renvoyées feront référence
chacune à sa propre variable locale de la fonction
test. C'est précisément ainsi que l'indépendance
du fonctionnement est atteinte.
Si l'on rend num variable globale,
cela constituera aussi une fermeture. Simplement, les
environnements lexicaux des fonctions renvoyées se réfèrent
à la même variable num - tout
changement apporté à cette variable sera visible dans
toutes les fonctions.
Déterminez, sans exécuter le code, ce qui sera affiché dans la 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();
Déterminez, sans exécuter le code, ce qui sera affiché dans la 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();
Déterminez, sans exécuter le code, ce qui sera affiché dans la 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();