Globaali laskurimuuttuja JavaScriptissä

Siirretään muuttuja num funktioiden ulkopuolelle, tehden siitä näin globaalin:

javascriptlet num = 1; // globaali muuttuja

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

Tässä tapauksessa kaikki palautetut funktiot muuttavat tätä globaalia muuttujaa ja laskurit toimivat riippuvaisina toisistaan:

javascriptlet num = 1;

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

let func1 = test(); // ensimmäinen laskuri
func1();  // tulostaa 1
func1();  // tulostaa 2

let func2 = test(); // toinen laskuri
func2();  // tulostaa 3
func2();  // tulostaa 4

Miksi sitten edellinen koodimme loi itsenäisiä laskureita? Muistutan tästä koodista:

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

Asia on siinä, että muuttuja num on paikallinen funktion test sisällä. Siksi jokainen funktion test kutsu synnyttää oman paikallisen muuttujansa.

Siksi palautetut funktiot viittaavat kukin omaan funktion test paikalliseen muuttujaansa. Näin itsenäinen toiminta saavutetaan.

Jos num tehdään globaaliksi muuttujaksi - se on myös sulkeuma. Palautettujen funktioiden leksikaaliset ympäristöt viittaavat samaan muuttujaan num - kaikki muutokset tässä muuttujassa näkyvät kaikissa funktioissa.

Задание 1

Päätä, suorittamatta koodia, mitä tulostetaan konsoliin:

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

Päätä, suorittamatta koodia, mitä tulostetaan konsoliin:

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

Päätä, suorittamatta koodia, mitä tulostetaan konsoliin:

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