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