Contatore con chiusure in JavaScript

Riscriviamo il codice che abbiamo esaminato in modo che la funzione restituita aumenti il valore della variabile num di uno ogni volta:

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

let func = test();

Risulterà che ogni chiamata della funzione func stamperà in console un nuovo valore:

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

let func = test();

func(); // stamperà 1
func(); // stamperà 2
func(); // stamperà 3
func(); // stamperà 4
func(); // stamperà 5

Risulta che abbiamo implementato un contatore di chiamate di funzione, utilizzando una chiusura (più precisamente utilizzando la variabile num dalla chiusura della nostra funzione).

Tieni presente che ogni chiamata della funzione test restituirà una nuova funzione, che avrà la propria chiusura. Cioè diversi contatori funzioneranno in modo indipendente:

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

let func1 = test(); // primo contatore
func1();  // stamperà 1
func1();  // stamperà 2

let func2 = test(); // secondo contatore
func2();  // stamperà 1
func2();  // stamperà 2

Risulta che la stessa variabile num per funzioni diverse avrà valori diversi!

Cioè, se chiamiamo la funzione test due volte, allora le funzioni ottenute da essa funzioneranno in modo indipendente e ciascuna di queste funzioni avrà la propria variabile indipendente num.

Задание 1

In modo autonomo, senza guardare il mio codice, implementa un contatore di chiamate di funzione, che funzioni con le chiusure.

Задание 2

Lascia che la funzione in chiusura memorizzi il numero 10. Fai in modo che ogni chiamata della funzione riduca questo numero di 1 e stampi in console il numero ridotto.

Задание 3

Modifica il problema precedente in modo che il conteggio arrivi a 0, e poi ogni chiamata successiva della funzione stampi in console un messaggio che il conteggio è terminato.