Ընդհանուր հաշվիչի փոփոխականը 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();