Globaalne loenduri muutuja JavaScriptis

Viime muutuja num funktsioonidest välja, muutes selle seeläbi globaalseks:

javascriptlet num = 1; // globaalne muutuja

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

Sel juhul kõik tagastatud funktsioonid muudavad seda globaalset muutujat ja loendurid töötavad üksteisest sõltuvalt:

javascriptlet num = 1;

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

let func1 = test(); // esimene loendur
func1();  // väljastab 1
func1();  // väljastab 2

let func2 = test(); // teine loendur
func2();  // väljastab 3
func2();  // väljastab 4

Miks siis meie eelmine kood tegi sõltumatuid loendureid? Tuletan meelde seda koodi:

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

Asi on selles, et muutuja num on lokaalne funktsiooni test sees. Seetõttu iga test väljakutse loob oma lokaalse muutuja.

Seetõttu viitavad tagastatud funktsioonid igaüks oma funktsiooni test lokaalsele muutujale. Just nii saavutatakse sõltumatu töö.

Kui teha num globaalseks muutujaks - on see samuti sulund. Lihtsalt tagastatud funktsioonide leksikaalsed keskkonnad viitavad samale muutujale num - kõik muutused selle muutujaga on nähtavad kõigis funktsioonides.

Задание 1

Määrake, ilma koodi käivitamata, mis väljastatakse konsooli:

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

Määrake, ilma koodi käivitamata, mis väljastatakse konsooli:

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

Määrake, ilma koodi käivitamata, mis väljastatakse konsooli:

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