JavaScriptda funktsiyalarning leksik muhitidan foydalanish

Faraz qilaylik, bizda natija sifatida boshqa funktsiyani qaytaruvchi funktsiya bor:

javascriptfunction test() {
  return function() {
    
  }
}

Agar ona funktsiyaning qandaydir o'zgaruvchilari bo'lsa, bu o'zgaruvchilar qaytarilayotgan funktsiyaning leksik muhitida saqlanadi:

javascriptfunction test() {
  let num = 1; // ona funktsiyaning o'zgaruvchisi
  
  return function() {
    // leksik muhit = {num: 1}
  }
}

Keling, bizning qaytarilayotgan funktsiya kodimizga console.log ni yozamiz, u num o'zgaruvchisining qiymatini chiqaradi:

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

Keling, endi test ona funktsiyasini chaqiramiz va uning ishlash natijasini func o'zgaruvchisiga yozamiz:

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

let func = test();

func o'zgaruvchisiga qaytarilgan funktsiya yoziladi. Keling, funktsiyamizni chaqiraylik - uning natijasi sifatida num o'zgaruvchisining tarkibi chiqariladi:

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

let func = test();
func(); // 1 ni chiqaradi

Agar num o'zgaruvchisini funktsiyadan tashqarida chiqarishga urinsak - u mavjud bo'lmaydi:

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

console.log(num); // num o'zgaruvchisi bu yerda mavjud emas

Ko'rib turganingizdek, num mahalliy o'zgaruvchisi bizning funktsiyamizning leksik muhitiga bog'landi va endi, ushbu funktsiyani kodning istalgan joyida chaqirganimizda, num o'zgaruvchisining qiymatini olishimiz mumkin, hatto chaqirish joyida o'zgaruvchining o'zi mavjud bo'lmasa ham.

Aslida, num o'zgaruvchisini global qilish orqali shunga o'xshash natijaga erishish mumkin:

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

let num = 1; // global o'zgaruvchi
let func = test();
func(); // 1 ni chiqaradi

Biroq, bu erda sezilarli farq bo'ladi: yangi variantda num o'zgaruvchisini funktsiyalardan tashqarida o'zgartirish mumkin (chunki u global), ammo eskisida - mumkin emas.

Задание 1

Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

let func = test();
console.log(func());
Задание 2

Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

console.log(test()());
Задание 3

Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:

javascriptfunction test() {
  let num1 = 1;
  
  return function() {
    return num1 + num2;
  }
}

let num2 = 2;
let func = test();
console.log(func());
Задание 4

Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    return num;
  }
}

let num = 2;
let func = test();
console.log(func());