Глабальная зменная лічыльніка ў 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();