Ֆունկցիաների բառային միջավայրի կիրառությունը JavaScript-ում
Ենթադրենք ունենք ֆունկցիա, որն իր արդյունքում վերադարձնում է մեկ այլ ֆունկցիա.
function test() {
return function() {
}
}
Եթե ծնող ֆունկցիան ունի որևէ փոփոխական, ապա այդ փոփոխականները կպարունակվեն վերադարձվող ֆունկցիայի բառային միջավայրում.
function test() {
let num = 1; // ծնող ֆունկցիայի փոփոխական
return function() {
// բառային միջավայր = {num: 1}
}
}
Գրենք մեր վերադարձվող ֆունկցիայի կոդում
console.log, որն արտածում է
num փոփոխականի արժեքը.
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());