Глобална променљива бројача у 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();