JavaScript asoslari

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:

func-expr.js
// natija shu yerda chiqadi

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:

func-qiymat.js
// natija shu yerda chiqadi
Muhim! 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:

func-log.js
// natija shu yerda chiqadi

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:

callback.js
// natija shu yerda chiqadi

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:

callback-anon.js
// natija shu yerda chiqadi
Callback funksiyalar JavaScript'da juda keng qo'llaniladi โ€” massivlar bilan ishlash (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:

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":

hoisting-decl.js
// natija shu yerda chiqadi

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
Yuqoridagi kod aynan xato holatni ko'rsatgani uchun {code} bloki sifatida berildi โ€” uni ishga tushirsangiz, izohsiz birinchi qator 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