Variable globale de compteur en JavaScript

Déplaçons la variable num en dehors des fonctions, la rendant ainsi globale :

javascriptlet 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 :

javascriptlet 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 :

javascriptfunction 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.

Задание 1

Déterminez, sans exécuter le code, ce qui sera affiché dans la console :

javascriptlet counter = 0;
    
function test() {
  return function() {
    console.log(counter);
    counter++;
  };
}

let func = test;

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Задание 2

Déterminez, sans exécuter le code, ce qui sera affiché dans la console :

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();
Задание 3

Déterminez, sans exécuter le code, ce qui sera affiché dans la console :

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();