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