Funksiya ifodalari
JavaScript'da funksiya alohida "til konstruksiyasi" emas โ u maxsus turdagi qiymat. Oldingi darsda funksiyani e'lon (declaration) sifatida yaratdik. Endi funksiyani ifoda (expression) sifatida yaratishni ko'ramiz.
Function Expression
Funksiyani ifoda ko'rinishida yaratish โ uni o'zgaruvchiga qiymat sifatida berish demakdir:
Bu yerda funksiya yaratildi va salomBer o'zgaruvchisiga joylandi. Diqqat qiling: function() dan keyin nom yo'q โ bu anonim (nomsiz) funksiya. E'londan farqli o'laroq, oxirida ; qo'yiladi, chunki bu oddiy o'zgaruvchiga qiymat berish ifodasi.
Funksiya โ bu qiymat
Funksiya โ qiymat bo'lgani uchun, uni boshqa qiymatlar kabi ishlatish mumkin. Masalan, bir o'zgaruvchidan ikkinchisiga nusxalash:
let nusxa = salom; โ qavs YO'Q. Agar let nusxa = salom(); yozsak, bu funksiyani chaqiradi va uning natijasini (bu holda undefined) nusxaga beradi, funksiyaning o'zini emas. Funksiya nomi qavssiz โ bu funksiyaga havola, qavs bilan โ bu chaqiruv.Funksiyani console.log bilan chiqarsak, uning kodini ko'ramiz โ chunki u qiymat:
Callback funksiyalar
Funksiya qiymat bo'lgani uchun uni boshqa funksiyaga argument sifatida uzatish mumkin. Bunday funksiyalar callback (qayta chaqiriladigan) funksiyalar deyiladi.
Quyidagi sora funksiyasi savol va ikkita funksiya oladi. Shartga qarab birini chaqiradi:
Bu yerda ha va yoq โ sora funksiyasiga uzatilgan callback'lar. sora ular ichida qanday kod borligini bilmaydi โ u faqat kerak bo'lganda ularni chaqiradi.
Ko'pincha callback'ni to'g'ridan-to'g'ri chaqiruv ichida, anonim funksiya sifatida yozish qulayroq bo'ladi:
forEach, map), hodisalarni tinglash, taymer va tarmoq so'rovlarida. Bu tushunchani yaxshi o'zlashtirish muhim.Function Expression va Function Declaration farqi
Ikki usul o'rtasida asosiy farq bor. Avvalo sintaksis:
- Declaration: alohida ifoda sifatida, asosiy kod oqimida:
function summa(a, b) { ... }; - Expression: boshqa ifoda ichida, odatda tenglik o'ng tomonida:
let summa = function(a, b) { ... };
Muhimroq farq โ qachon yaratilishida. Bu "hoisting" (ko'tarilish) bilan bog'liq.
Function Declaration ko'tariladi (hoisting)
Function Declaration e'lon qilinishidan oldin ham chaqirilishi mumkin. JavaScript dvigateli skriptni ishga tushirishdan oldin barcha Function Declaration'larni topib, "ko'taradi":
Function Expression ko'tarilmaydi
Function Expression esa faqat o'zining kod qatoriga yetganda yaratiladi. Undan oldin chaqirib bo'lmaydi:
// salom("Ali"); // XATO! salom hali mavjud emas
let salom = function(ism) {
console.log("Salom, " + ism);
};
salom("Ali"); // Endi ishlaydi
ReferenceError beradi. Sababi: let salom = function... ifodasi o'z qatoriga yetgandagina bajariladi, undan oldin salom mavjud emas.Qaysi birini tanlash?
Umumiy tavsiya: iloji bo'lsa Function Declaration ni afzal ko'ring. U kodni tashkil qilishda erkinlik beradi (e'londan oldin ham ishlatish mumkin) va o'qishga qulayroq โ function ... so'zini ko'rish bilanoq "bu funksiya" ekanini bilamiz.
Function Expression esa Declaration mos kelmagan hollarda ishlatiladi โ masalan, funksiyani shartga qarab yaratish yoki uni argument (callback) sifatida uzatishda.
Xulosa
- Funksiya โ bu qiymat; uni nusxalash, uzatish va o'zgaruvchida saqlash mumkin;
- Function Declaration:
function nom() {}โ asosiy kod oqimida, alohida; - Function Expression:
let nom = function() {};โ ifoda ichida; - Callback โ boshqa funksiyaga argument sifatida uzatilgan funksiya;
- Declaration ko'tariladi (e'londan oldin chaqirsa bo'ladi), Expression esa ko'tarilmaydi;
- Umuman Function Declaration afzalroq, callback va shartli yaratishda Expression qulay.