JavaScript функцияларынын лексикалык айланасын колдонуу

Бизде натыйжасы катары башка функцияны кайтаруучу функция бар дейли:

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

Эгер ата-эне функциясынын кандайдыр бир өзгөрмөлөрү болсо, анда бул өзгөрмөлөр кайтарылган функциянын лексикалык айланасында камтылат:

javascriptfunction test() {
  let num = 1; // ата-эне функциясынын өзгөрмөсү
  
  return function() {
    // лексикалык айлана = {num: 1}
  }
}

Кайтарылган функциябыздын кодуна num өзгөрмөсүнүн маанисин чыгаруучу console.log жазалы:

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 өзгөрмөсү биздин функциябыздын лексикалык айланасына байланыштырылып калды жана эми бул функцияны коддун каалаган жеринде чакырганда, биз 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());