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