JavaScript-də Qlobal Sayğış Dəyişəni

Gəlin <num dəyişənini funksiyaların xaricində elan edək, beləliklə onu qlobal edək:

javascriptlet num = 1; // qlobal dəyişən

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

Bu halda, bütün qaytarılan funksiyalar bu qlobal dəyişəni dəyişdirəcək və sayğışlar artıq bir-birindən asılı olaraq işləyəcək:

javascriptlet num = 1;

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

let func1 = test(); // birinci sayğış
func1();  // 1 çap ediləcək
func1();  // 2 çap ediləcək

let func2 = test(); // ikinci sayğış
func2();  // 3 çap ediləcək
func2();  // 4 çap ediləcək

Bəs əvvəlki kodumuz niyə müstəqil sayğışlar yaradırdı? Bu kodu xatırladım:

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

Məsələ ondadır ki, <num dəyişəni - <test funksiyasının daxilində lokal dəyişəndir. Buna görə də hər <test çağırışı öz lokal dəyişənini yaradır.

Buna görə də qaytarılan funksiyalar hər biri <test funksiyasının öz lokal dəyişəninə istinad edəcək. Məhz beləliklə müstəqillik təmin olunur.

Əgər <num-i qlobal dəyişən etsək - bu da bir qapanış olacaq. Sadəcə, qaytarılan funksiyaların leksik mühitləri eyni <num dəyişəninə istinad edir - bu dəyişəndə olan hər hansı dəyişiklik bütün funksiyalarda görünəcək.

Задание 1

Kodu işə salmadan müəyyən edin ki, konsola nə çap olunacaq:

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

Kodu işə salmadan müəyyən edin ki, konsola nə çap olunacaq:

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

Kodu işə salmadan müəyyən edin ki, konsola nə çap olunacaq:

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