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