Globálna premenná počítadla v JavaScripte

Premennú num vyberieme mimo funkcií, čím ju urobíme globálnou:

javascriptlet num = 1; // globálna premenná

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

V tomto prípade budú všetky vrátené funkcie meniť túto globálnu premennú a počítadlá budú pracovať už závisle od seba:

javascriptlet num = 1;

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

let func1 = test(); // prvé počítadlo
func1();  // vypíše 1
func1();  // vypíše 2

let func2 = test(); // druhé počítadlo
func2();  // vypíše 3
func2();  // vypíše 4

Prečo náš predchádzajúci kód robil nezávislé počítadlá? Pripomínam tento kód:

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

Vec sa má tak, že premenná num je lokálna vo vnútri funkcie test. Preto každé volanie test vytvorí svoju vlastnú lokálnu premennú.

Preto sa vrátené funkcie budú odkazovať každá na svoju lokálnu premennú funkcie test. Práve tak sa dosiahne nezávislosť činnosti.

Ak sa num urobí globálnou premennou - bude to tiež uzávierka. Jednoducho lexikálne prostredia vrátených funkcií sa odkazujú na rovnakú premennú num - akékoľvek zmeny tejto premennej budú viditeľné vo všetkých funkciách.

Задание 1

Určte, bez spustenia kódu, čo sa vypíše do konzoly:

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

Určte, bez spustenia kódu, čo sa vypíše do konzoly:

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

Určte, bez spustenia kódu, čo sa vypíše do konzoly:

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