Globale Zählervariable in JavaScript

Wir setzen die Variable num außerhalb der Funktionen, damit sie global wird:

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

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

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

Задание 1

Bestimmen Sie, ohne den Code auszuführen, was in der Konsole ausgegeben wird:

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

Bestimmen Sie, ohne den Code auszuführen, was in der Konsole ausgegeben wird:

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

Bestimmen Sie, ohne den Code auszuführen, was in der Konsole ausgegeben wird:

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