JavaScriptda IIFEni chaqirishdagi shubhali jihatlar
Keling, ikkita kod bo'lagini ko'rib chiqaylik.
Birinchi:
let result = 1
+function() {
return 2;
}();
console.log(result);
Ikkinchi:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Ushbu ikkala kod bo'lagi deyarli bir xil,
lekin ularni ishga tushirish natijasi har xil bo'ladi.
Birinchi kod konsolga 3 sonini chiqaradi,
ikkinchisi esa 1 sonini.
Nima uchun bunday farq paydo bo'ldi: barcha ish shundaki, bir holatda birinchi qatorda kod oxirida nuqta-vergul yo'q, ikkinchi holatda esa mavjud.
Siz so'rashingiz mumkin: bu qanday bo'lishi mumkin, axir JavaScriptda nuqta-vergul buyruq oxirida majburiy emas! Aslida bu butunlay shunday emas. Keling, aslida nima bo'layotganini aniq ko'rib chiqaylik.
Birinchi kodni shunday qayta yozish mumkin:
let result = 1 + function() {
return 2;
}();
console.log(result); // 3 ni chiqaradi
Endi darhol ayon bo'ladiki,
birga funksiyani joyida chaqirish natijasi
qo'shiladi, ya'ni 2. Shuning uchun yakuniy
natija 3 bo'ladi.
Agar birdan keyin nuqta-vergul qo'yilsa, kod interpryator tomonidan boshqacha qabul qilinadi:
// Birinchi buyruq:
let result = 1;
// Ikkinchi buyruq:
+function() {
return 2;
}();
// Uchinchi buyruq:
console.log(result); // 1 ni chiqaradi
Ya'ni o'zgaruvchiga tayinlash va funksiyani joyida chaqirish turli buyruqlar bo'lib qoladi. Va barchasi nuqta-vergul mavjudligi tufayli!
Ma'lum bo'ladiki, bu holda funksiyani chaqirish
umuman hech narsa qilmaydi - shunchaki
hech qayerga 2 sonini qaytaradi, bu
result o'zgaruvchisiga hech qanday ta'sir ko'rsatmaydi.
Keling, unda aniqlab olaylik, nega biz umuman JavaScriptda nuqta-vergul yozmasligimiz mumkin. Bizda nuqta-vergulsiz shunday kod bo'lsin:
let result = 1 // resultga 1 yoziladi
let test = 2 // testga 2 yoziladi
U to'g'ri ishlaydi, chunki interpryator har bir qator oxiriga nuqta-vergulni o'zi qo'ydi.
Lekin shunday kodga qarang:
let result = 1
+ 2; // resultga 3 yoziladi
Endi birinchi qator oxirida nuqta-vergul avtomatik ravishda qo'yilmaydi, chunki interpryator ikkinchi qatordagi buyruq bu birinchi qator buyrug'ining bir qismi ekanligini tushunadi.
Agar biz o'zimiz nuqta-vergul qo'ysak - natija butunlay boshqacha bo'ladi:
let result = 1; // resultga 1 yoziladi
+ 2; // buyruq hech narsa qilmaydi, lekin xato ham bo'lmaydi
Ma'lum bo'ladiki, interpryator nuqta-vergulni o'zi qo'yadi, faqat keyingi buyruq oldingisining bir qismi bo'lmasa.
Endi esa ushbu kodga qarang:
let result = 1
+function() {
return 2;
}();
console.log(result);
Darhaqiqat, ikkinchi qator - shunchaki birinchi qator buyrug'ining davomi va interpryator nuqta-vergulni avtomatik ravishda qo'ymaydi. Aynan shuning uchun, agar biz birinchi qator oxiriga nuqta-vergulni o'zimiz yozsak - natija butunlay boshqacha bo'ladi. Bu shuni ko'rsatadiki, muammolarning oldini olish uchun, kerakli joylarda har doim nuqta-vergul qo'yish eng yaxshisidir.