Variabile globale contatore in JavaScript

Portiamo la variabile num fuori dalle funzioni, rendendola così globale:

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

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

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

Задание 1

Determinate, senza eseguire il codice, cosa verrà visualizzato in 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

Determinate, senza eseguire il codice, cosa verrà visualizzato in 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

Determinate, senza eseguire il codice, cosa verrà visualizzato in 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();