Variável Global de Contador em JavaScript

Vamos colocar a variável num fora das funções, tornando-a assim global:

javascriptlet num = 1; // variável global

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

Neste caso, todas as funções retornadas irão alterar esta variável global e os contadores irão funcionar de forma dependente um do outro:

javascriptlet num = 1;

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

let func1 = test(); // primeiro contador
func1();  // exibirá 1
func1();  // exibirá 2

let func2 = test(); // segundo contador
func2();  // exibirá 3
func2();  // exibirá 4

Por que nosso código anterior criava contadores independentes? Lembre-se deste código:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  };
};

O fato é que a variável num é local dentro da função test. Portanto, cada chamada de test cria sua própria variável local.

Portanto, as funções retornadas irão referenciar cada uma a sua própria variável local da função test. É assim que a independência de operação é alcançada.

Se num for tornada uma variável global - isso ainda será um closure. Simplesmente os ambientes lexicais das funções retornadas referenciam a mesma variável num - quaisquer alterações nesta variável serão visíveis em todas as funções.

Задание 1

Determine, sem executar o código, o que será exibido no 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

Determine, sem executar o código, o que será exibido no 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

Determine, sem executar o código, o que será exibido no 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();