JavaScript функцияларының лексикалық ортасын қолдану
Бізде нәтижесі ретінде басқа функцияны қайтаратын функция бар делік:
function test() {
return function() {
}
}
Егер аталық функцияның қандай да бір айнымалылары болса, онда бұл айнымалылар қайтарылатын функцияның лексикалық ортасында болады:
function test() {
let num = 1; // аталық функцияның айнымалысы
return function() {
// лексикалық орта = {num: 1}
}
}
Қайтарылатын функциямыздың кодында num
айнымалысының мәнін шығаратын console.log
жазайық:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Енді аталық test функциясын шақырып, оның
жұмысының нәтижесін func айнымалысына жазайық:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func айнымалысына қайтарылатын функция жазылады.
Функциямызды шақырайық - ол нәтиже ретінде num
айнымалысының мазмұнын шығарады:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // 1 шығарады
Егер функциядан тыс num айнымалысын шығаруға
жаттығысатын болсақ - ол қол жетімсіз болады:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // num айнымалысы мұнда қол жетімсіз
Көріп отырғаныңыздай, num жергілікті айнымалысы
функциямыздың лексикалық ортасына байланды және енді
кодтың кез келген жерінде бұл функцияны шақыру арқылы
біз num айнымалысының мәнін ала аламыз, тіпті
шақыру орнында бұл айнымалының өзі қол жетімді болмаса да.
Шын мәнінде, осындай нәтижеге num айнымалысын
жаһандық ету арқылы қол жеткізуге болады:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // жаһандық айнымалы
let func = test();
func(); // 1 шығарады
Бірақ бұл жерде айтарлықтай айырмашылық болады:
жаңа нұсқада num айнымалысын функциялардан тыс
өзгертуге болады (себебі ол жаһандық), ал ескі нұсқада - болмайды.
Кодты істемеден, консольге не шығарылатынын анықтаңыз:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Кодты істемеден, консольге не шығарылатынын анықтаңыз:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Кодты істемеден, консольге не шығарылатынын анықтаңыз:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Кодты істемеден, консольге не шығарылатынын анықтаңыз:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());