Глобална променлива за бројач во JavaScript

Да ја изнесеме променливата num надвор од функциите, со тоа што ќе ја направиме глобална:

javascriptlet num = 1; // глобална променлива

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

Во овој случај, сите вратени функции ќе ја менуваат истата глобална променлива и бројачите ќе работат зависно еден од друг:

javascriptlet num = 1;

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

let func1 = test(); // прв бројач
func1();  // ќе испише 1
func1();  // ќе испише 2

let func2 = test(); // втор бројач
func2();  // ќе испише 3
func2();  // ќе испише 4

Зошто тогаш нашиот претходен код создаваше независни бројачи? Да го потсетам тој код:

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

Работата е во тоа што променливата num е локална внатре во функцијата test. Затоа секој повик на test создава своја локална променлива.

Затоа, вратените функции ќе се однесуваат секоја на својата локална променлива на функцијата test. Токму на овој начин се постигнува независност во работата.

Доколку num се направи глобална променлива - тоа исто така ќе биде затворање. Едноставно, лексичките околини на вратените функции се однесуваат на истата променлива num - сите промени со оваа променлива ќе бидат видливи во сите функции.

Задание 1

Определи, без да ја стартуваш кодот, што ќе се испише во конзолата:

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

Определи, без да ја стартуваш кодот, што ќе се испише во конзолата:

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

Определи, без да ја стартуваш кодот, што ќе се испише во конзолата:

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