Variable global contadora en JavaScript

Saquemos la variable num de las funciones, haciéndola así global:

javascriptlet num = 1; // variable global

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

En este caso, todas las funciones devueltas modificarán esta variable global y los contadores trabajarán de manera dependiente entre sí:

javascriptlet num = 1;

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

let func1 = test(); // primer contador
func1();  // mostrará 1
func1();  // mostrará 2

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

¿Por qué nuestro código anterior creaba contadores independientes? Permítanme recordarles ese código:

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

El caso es que la variable num es local dentro de la función test. Por lo tanto, cada llamada a test genera su propia variable local.

Por lo tanto, las funciones devueltas harán referencia cada una a su propia variable local de la función test. Así es exactamente como se logra la independencia en el funcionamiento.

Si se hace que num sea una variable global, también será un cierre. Simplemente los entornos léxicos de las funciones devueltas hacen referencia a la misma variable num - cualquier cambio en esta variable será visible en todas las funciones.

Задание 1

Determine, sin ejecutar el código, qué se mostrará en la consola:

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, sin ejecutar el código, qué se mostrará en la consola:

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, sin ejecutar el código, qué se mostrará en la consola:

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