Globālā skaitītāja mainīgā JavaScript

Izņemsim mainīgo num ārpus funkcijām, tādējādi padarot to par globalu:

javascriptlet num = 1; // globālais mainīgais

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

Šajā gadījumā visas atgrieztās funkcijas mainīs šo globalo mainīgo un skaitītāji strādās atkarīgi viens no otra:

javascriptlet num = 1;

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

let func1 = test(); // pirmais skaitītājs
func1();  // izvadīs 1
func1();  // izvadīs 2

let func2 = test(); // otrais skaitītājs
func2();  // izvadīs 3
func2();  // izvadīs 4

Kāpēc tad mūsu iepriekšējais kods veidoja neatkarīgus skaitītājus? Atgādināšu šo kodu:

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

Lieta ir tāda, ka mainīgais num - lokāls funkcijas test iekšienē. Tāpēc katrs test izsaukums rada savu lokālo mainīgo.

Tāpēc atgrieztās funkcijas atsauksies katra uz savu funkcijas test lokālo mainīgo. Tieši tā tiek panākta neatkarīga darbība.

Ja padara num par globalu mainīgo - tas arī būs aizvērums. Vienkārši leksiskās vides atgrieztajām funkcijām atsaucas uz vienu un to pašu mainīgo num - jebkādas izmaiņas šajā mainīgajā būs redzamas visās funkcijās.

Задание 1

Noteikt, nepalaist kodu, kas tiks izvadīts konsolē:

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

Noteikt, nepalaist kodu, kas tiks izvadīts konsolē:

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

Noteikt, nepalaist kodu, kas tiks izvadīts konsolē:

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