JavaScriptda Global Hisoblagich Oʻzgaruvchisi

num oʻzgaruvchisini funksiyalardan tashqariga chiqaramiz, shu bilan uni global qilamiz:

javascriptlet num = 1; // global oʻzgaruvchi

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

Bunda barcha qaytarilgan funksiyalar ushbu global oʻzgaruvchini oʻzgartiradi va hisoblagichlar bir-biriga bogʻliq boʻlib ishlaydi:

javascriptlet num = 1;

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

let func1 = test(); // birinchi hisoblagich
func1();  // 1 chiqadi
func1();  // 2 chiqadi

let func2 = test(); // ikkinchi hisoblagich
func2();  // 3 chiqadi
func2();  // 4 chiqadi

Nima uchun bizning oldingi kodimiz mustaqil hisoblagichlar yaratgan edi? Ushbu kodni eslaymiz:

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

Gap shundaki, num oʻzgaruvchisi test funksiyasi ichida lokal oʻzgaruvchidir. Shuning uchun har bir test chaqiruvi oʻzining lokal oʻzgaruvchisini yaratadi.

Demak, qaytarilgan funksiyalar test funksiyasining har biriga oʻzining lokal oʻzgaruvchisiga murojat qiladi. Ishlash mustaqilligi shu tarzda erishiladi.

Agar num ni global oʻzgaruvchi qiladigan boʻlsak - bu ham yopilish boʻladi. Faqatgina qaytarilgan funksiyalarning leksik muhitlari bir xil num oʻzgaruvchisiga murojat qiladi - ushbu oʻzgaruvchidagi har qanday oʻzgarishlar barcha funksiyalarda koʻrinadi.

Задание 1

Kodni ishlamasdan, konsolda nima chiqishini aniqlang:

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

Kodni ishlamasdan, konsolda nima chiqishini aniqlang:

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

Kodni ishlamasdan, konsolda nima chiqishini aniqlang:

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