JavaScriptda funktsiyalarning leksik muhitidan foydalanish
Faraz qilaylik, bizda natija sifatida boshqa funktsiyani qaytaruvchi funktsiya bor:
function test() {
return function() {
}
}
Agar ona funktsiyaning qandaydir o'zgaruvchilari bo'lsa, bu o'zgaruvchilar qaytarilayotgan funktsiyaning leksik muhitida saqlanadi:
function test() {
let num = 1; // ona funktsiyaning o'zgaruvchisi
return function() {
// leksik muhit = {num: 1}
}
}
Keling, bizning qaytarilayotgan funktsiya kodimizga
console.log ni yozamiz, u num
o'zgaruvchisining qiymatini chiqaradi:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Keling, endi test ona funktsiyasini chaqiramiz
va uning ishlash natijasini func o'zgaruvchisiga
yozamiz:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func o'zgaruvchisiga qaytarilgan funktsiya
yoziladi. Keling, funktsiyamizni chaqiraylik - uning
natijasi sifatida num o'zgaruvchisining
tarkibi chiqariladi:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // 1 ni chiqaradi
Agar num o'zgaruvchisini funktsiyadan tashqarida
chiqarishga urinsak - u mavjud bo'lmaydi:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // num o'zgaruvchisi bu yerda mavjud emas
Ko'rib turganingizdek, num mahalliy o'zgaruvchisi
bizning funktsiyamizning leksik muhitiga bog'landi
va endi, ushbu funktsiyani kodning istalgan joyida
chaqirganimizda, num o'zgaruvchisining qiymatini
olishimiz mumkin, hatto chaqirish joyida o'zgaruvchining
o'zi mavjud bo'lmasa ham.
Aslida, num o'zgaruvchisini global qilish orqali
shunga o'xshash natijaga erishish mumkin:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // global o'zgaruvchi
let func = test();
func(); // 1 ni chiqaradi
Biroq, bu erda sezilarli farq bo'ladi:
yangi variantda num o'zgaruvchisini
funktsiyalardan tashqarida o'zgartirish mumkin
(chunki u global), ammo eskisida - mumkin emas.
Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Kodni ishga tushirmasdan, konsolda nima chiqishini aniqlang:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());