Pasaulinė skaitiklio kintamoji JavaScript

Iškelkime kintamąjį num už funkcijų ribų, taip padarydami jį pasauliniu:

javascriptlet num = 1; // pasaulinis kintamasis

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

Šiuo atveju visos grąžinamos funkcijos keis šį pasaulini kintamąjį ir skaitikliai veiks priklausomai vienas nuo kito:

javascriptlet num = 1;

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

let func1 = test(); // pirmas skaitiklis
func1();  // išves 1
func1();  // išves 2

let func2 = test(); // antras skaitiklis
func2();  // išves 3
func2();  // išves 4

Kodėl mūsų ankstesnis kodas darė nepriklausomus skaitiklius? Priminsiu šį kodą:

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

Reikalas tas, kad kintamasis num yra lokalus funkcijos test viduje. Todėl kiekvienas test iškvietimas sukuria savo lokalų kintamąjį.

Todėl grąžinamos funkcijos nuorodos kiekviena į savo funkcijos test lokalų kintamąjį. Būtent taip ir pasiekiamas nepriklausomumas veikimo.

Jei padarytume num pasauliniu kintamuoju - tai taip pat bus uždaroji funkcija. Tiesiog leksinės grąžinamų funkcijų aplinkos nuoroda į tą patį kintamąjį num - bet kokie pakeitimai su šiuo kintamuoju bus matomi visose funkcijose.

Задание 1

Nustatykite, nepaleisdami kodo, kas bus išvesta į konsolę:

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

Nustatykite, nepaleisdami kodo, kas bus išvesta į konsolę:

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

Nustatykite, nepaleisdami kodo, kas bus išvesta į konsolę:

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