JavaScript функцияларининг лексик муҳитидан фойдаланиш

Фараз қилайлик, бизда натижаси сифатида бошқа функцияни қайтарадиган функция бор:

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

Агар ота-она функциянинг ўзгарувчилари бўлса, у ҳолда бу ўзгарувчилар қайтарилган функциянинг лексик муҳитида сақланади:

javascriptfunction test() {
  let num = 1; // ота-она функциянинг ўзгарувчиси
  
  return function() {
    // лексик муҳит = {num: 1}
  }
}

Кодда бизнинг қайтарилган функциямизга console.log ни ёзамиз, у num ўзгарувчисининг қийматини чиқаради:

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

Келинг энди ота-она функцияни test чақириб, унинг натижасини func ўзгарувчисига ёзайлик:

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

let func = test();

func ўзгарувчисига қайтарилган функция ёзилади. Келинг бизнинг функцияни чақирайлик - у ўз натижаси сифатида num ўзгарувчисининг мўлжалини чиқаради:

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

let func = test();
func(); // 1 ни чиқаради

Агар num ўзгарувчисини функциядан ташқарида чиқармоқчи бўлсак, у дастурга ноаник бўлади:

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

console.log(num); // num ўзгарувчиси бу ерда ноаник

Кўриб турганингиздек, локал num ўзгарувчиси бизнинг функциямизнинг лексик муҳитига богланди ва энди, бу функцияни коднинг istalgan joyida чақирсак, biz num ўзгарувчисининг қийматини ола оламиз, ҳатто чақириш жойида ўзида бу ўзгарувчи ноаник бўлса-да.

Аслида, шу натижага num ўзгарувчисини глобал қилиб ҳам эришиш мумкин:

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

let num = 1; // глобал ўзгарувчи
let func = test();
func(); // 1 ни чиқаради

Бирок, бу ерда мухим тафовут бўлади: янги вариантда num ўзгарувчисини функциялардан ташқарида ўзгартириш мумкин (чунки у глобал), эскисида эса - йўқ.

Задание 1

Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:

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

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

Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:

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

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

Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:

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

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

Кодни ишлатмасдан, консолга нима чиқаришини аниқланг:

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

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