JavaScript-da funksiya âsehr tilining tuzilishiâ emas, balki maxsus turdagi qiymat hisoblanadi.
Ilgari ishlatgan sintaksis Funksiya eâloni deb ataladi:
function sayHi() {
alert("Salom");
}
Funksiya yaratishning yana bir sintaksisi bor, u Funksiya ifodasi deb ataladi.
Bu bizga har qanday ifoda oârtasida yangi funksiya yaratishga imkon beradi.
Masalan:
let sayHi = function () {
alert("Salom");
};
Bu yerda sayHi oâzgaruvchisi qiymat olayotganini koâramiz, yangi funksiya function() { alert("Salom"); } sifatida yaratilgan.
Funksiya yaratish tayinlash ifodasining kontekstida (= ning oâng tomonida) sodir boâlgani uchun, bu Funksiya ifodasidir.
Eâtibor bering, function kalit soâzidan keyin nom yoâq. Funksiya ifodalari uchun nomni tashlab qoâyish ruxsat etilgan.
Bu yerda biz uni darhol oâzgaruvchiga tayinlaymiz, shuning uchun bu kod namunalarining maânosi bir xil: âfunksiya yarating va uni sayHi oâzgaruvchisiga qoâyingâ.
Keyinroq duch keladigan ilgâor vaziyatlarda funksiya yaratilishi va darhol chaqirilishi yoki keyingi bajarilish uchun rejalashtirilishi mumkin, hech qayerda saqlanmasdan, shuning uchun anonim boâlib qoladi.
Funksiya â bu qiymat
Takrorlaymiz: funksiya qanday yaratilganidan qatâiy nazar, funksiya qiymatdir. Yuqoridagi ikkala misol ham funksiyani sayHi oâzgaruvchisida saqlaydi.
Biz hatto bu qiymatni alert yordamida chop etishimiz ham mumkin:
function sayHi() {
alert( "Salom" );
}
alert( sayHi ); // funksiya kodini ko'rsatadi
Eâtibor bering, oxirgi qator funksiyani ishga tushirmaydi, chunki sayHi dan keyin qavslar yoâq. Funksiya nomini eslatish uning bajarilishiga olib keladigan dasturlash tillari bor, lekin JavaScript bunday emas.
JavaScript-da funksiya qiymat, shuning uchun biz u bilan qiymat sifatida muomala qilishimiz mumkin. Yuqoridagi kod uning satr koârinishini, yaâni manba kodini koârsatadi.
Albatta, funksiya maxsus qiymat, chunki biz uni sayHi() kabi chaqirishimiz mumkin.
Lekin u hali ham qiymat. Shuning uchun biz u bilan boshqa turdagi qiymatlar kabi ishlashimiz mumkin.
Funksiyani boshqa oâzgaruvchiga nusxalashimiz mumkin:
function sayHi() {
// (1) yaratish
alert("Salom");
}
let func = sayHi; // (2) nusxalash
func(); // Salom // (3) nusxani ishga tushirish (ishlaydi)!
sayHi(); // Salom // bu ham hali ishlaydi (nega ishlamasin)
Bu yerda batafsil nima sodir boâladi:
- Funksiya eâloni
(1)funksiyani yaratadi va unisayHinomli oâzgaruvchiga qoâyadi. (2)qator unifuncoâzgaruvchisiga nusxalaydi. Yana eâtibor bering:sayHidan keyin qavslar yoâq. Agar boâlganida,func = sayHi()sayHi()chaqiruv natijasinifuncga yozar edi,sayHifunksiyasining oâzini emas.- Endi funksiyani ham
sayHi(), hamfunc()sifatida chaqirish mumkin.
Birinchi qatorda sayHi ni eâlon qilish uchun Funksiya ifodasidan ham foydalanishimiz mumkin edi:
let sayHi = function () {
// (1) yaratish
alert("Salom");
};
let func = sayHi; //(2)
// ...
Hammasi bir xil ishlaydi.
Siz hayron boâlishingiz mumkin, nega Funksiya ifodalari oxirida nuqta-vergul ; bor, lekin Funksiya eâlonlarida yoâq:
function sayHi() {
// ...
}
let sayHi = function() {
// ...
};
Javob oddiy: Funksiya ifodasi bu yerda tayinlash ifodasining ichida function(â¦) {â¦} sifatida yaratilgan: let sayHi = â¦;. Nuqta-vergul ; ifoda oxirida tavsiya etiladi, u funksiya sintaksisining qismi emas.
Nuqta-vergul oddiy tayinlash uchun ham boâlardi, masalan let sayHi = 5;, va funksiya tayinlash uchun ham bor.
Callback funksiyalar
Funksiyalarni qiymat sifatida uzatish va funksiya ifodalaridan foydalanishning koâproq misollarini koârib chiqamiz.
Biz uchta parametrli ask(question, yes, no) funksiyasini yozamiz:
question- Savol matni
yes- Javob âHaâ boâlsa ishga tushadigan funksiya
no- Javob âYoâqâ boâlsa ishga tushadigan funksiya
Funksiya question ni soârashi va foydalanuvchi javobiga qarab yes() yoki no() ni chaqirishi kerak:
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
function showOk() {
alert( "Siz rozi bo'ldingiz." );
}
function showCancel() {
alert( "Siz bajarishni bekor qildingiz." );
}
// foydalanish: showOk, showCancel funksiyalari ask ga argument sifatida uzatiladi
ask("Rozimisiz?", showOk, showCancel);
Amalda bunday funksiyalar juda foydali. Haqiqiy hayotdagi ask va yuqoridagi misol oârtasidagi asosiy farq shundaki, haqiqiy funksiyalar foydalanuvchi bilan oddiy confirm dan koâra murakkabroq usullar bilan muloqot qiladi. Brauzerde bunday funksiyalar odatda chiroyli koârinishdagi savol oynasini chizadi. Lekin bu boshqa hikoya.
ask ning showOk va showCancel argumentlari callback funksiyalar yoki shunchaki callbacklar deb ataladi.
Gâoya shundan iboratki, biz funksiyani uzatamiz va kerak boâlsa keyinroq âchaqirib olinishiniâ kutamiz. Bizning holimizda showOk âhaâ javobi uchun callback boâladi va showCancel âyoâqâ javobi uchun.
Funksiya ifodalaridan foydalanib ekvivalent, qisqaroq funksiya yozishimiz mumkin:
function ask(question, yes, no) {
if (confirm(question)) yes()
else no();
}
ask(
"Rozimisiz?",
function() { alert("Siz rozi bo'ldingiz."); },
function() { alert("Siz bajarishni bekor qildingiz."); }
);
Bu yerda funksiyalar toâgâridan-toâgâri ask(...) chaqiruvi ichida eâlon qilingan. Ularning nomi yoâq va shuning uchun anonim deb ataladi. Bunday funksiyalar ask dan tashqarida mavjud emas (chunki ular oâzgaruvchilarga tayinlanmagan), lekin bu yerda aynan biz xohlagan narsa.
Bunday kod bizning skriptlarimizda juda tabiiy koârinadi, bu JavaScript ruhida.
Satrlar yoki raqamlar kabi oddiy qiymatlar maâlumotni ifodalaydi.
Funksiyani harakat sifatida qabul qilish mumkin.
Biz uni oâzgaruvchilar orasida uzatishimiz va xohlagan vaqtda ishga tushirishimiz mumkin.
Funksiya ifodasi vs Funksiya eâloni
Funksiya eâlonlari va ifodalari oârtasidagi asosiy farqlarni shakllantiramiz.
Birinchidan, sintaksis: kodni ularni qanday farqlash.
-
Funksiya eâloni: asosiy kod oqimida alohida ifoda sifatida eâlon qilingan funksiya:
// Funksiya e'loni function sum(a, b) { return a + b; } -
Funksiya ifodasi: ifoda ichida yoki boshqa sintaksis konstruksiyasi ichida yaratilgan funksiya. Bu yerda funksiya âtayinlash ifodasiningâ
=oâng tomonida yaratilgan:// Funksiya ifodasi let sum = function (a, b) { return a + b; };
Yanada nozik farq â JavaScript dvigateli tomonidan funksiya qachon yaratilishidir.
Funksiya ifodasi bajarilish unga yetganda yaratiladi va faqat oâsha paytdan boshlab foydalanish mumkin.
Bajarilish oqimi tayinlashning oâng tomoniga let sum = function⦠oâtgach â mana, funksiya yaratildi va endi undan foydalanish mumkin (tayinlash, chaqirish va hokazo).
Funksiya eâlonlari boshqacha.
Funksiya eâloni u aniqlanishidan oldin chaqirilishi mumkin.
Masalan, global Funksiya eâloni butun skriptda, qayerda boâlishidan qatâiy nazar koârinadi.
Bu ichki algoritmlar tufayli. JavaScript skriptni ishga tushirishga tayyorlanayotganda, u avval undagi global Funksiya eâlonlarini qidiradi va funksiyalarni yaratadi. Buni âinitsializatsiya bosqichiâ deb hisoblashimiz mumkin.
Va barcha Funksiya eâlonlari qayta ishlangandan keyin kod bajariladi. Shuning uchun u bu funksiyalarga kirish huquqiga ega.
Masalan, bu ishlaydi:
sayHi("John"); // Salom, John
function sayHi(name) {
alert( `Salom, ${name}` );
}
Funksiya eâloni sayHi JavaScript skriptni boshlashga tayyorlanayotganda yaratiladi va unda hamma joyda koârinadi.
â¦Agar bu Funksiya ifodasi boâlganida, u ishlamasdi:
sayHi("John"); // xato!
let sayHi = function(name) { // (*) endi sehr yo'q
alert( `Salom, ${name}` );
};
Funksiya ifodalari bajarilish ularga yetganda yaratiladi. Bu faqat (*) qatorida sodir boâladi. Juda kech.
Funksiya eâlonlarining yana bir maxsus xususiyati â ularning blok koâlami.
Qatâiy rejimda Funksiya eâloni kod bloki ichida boâlganda, u oâsha blok ichida hamma joyda koârinadi. Lekin undan tashqarida emas.
Masalan, tasavvur qilaylik, biz bajarilish vaqtida oladigan age oâzgaruvchisiga qarab welcome() funksiyasini eâlon qilishimiz kerak. Va keyin uni keyinroq ishlatishni rejalashtirmoqdamiz.
Agar Funksiya eâlonidan foydalansak, u moâljallanganidek ishlamaydi:
let age = prompt("Yoshingiz necha?", 18);
// shartli ravishda funksiya e'lon qilish
if (age < 18) {
function welcome() {
alert("Salom!");
}
} else {
function welcome() {
alert("Assalomu alaykum!");
}
}
// ...keyinroq foydalanish
welcome(); // Xato: welcome aniqlanmagan
Buning sababi shundaki, Funksiya eâloni faqat oâzi joylashgan kod bloki ichida koârinadi.
Mana yana bir misol:
let age = 16; // misol uchun 16 ni olaylik
if (age < 18) {
welcome(); // \ (ishlaydi)
// |
function welcome() { // |
alert("Salom!"); // | Funksiya e'loni e'lon qilingan
} // | blokda hamma joyda mavjud
// |
welcome(); // / (ishlaydi)
} else {
function welcome() {
alert("Assalomu alaykum!");
}
}
// Bu yerda biz jingalak qavslardan tashqaridamiz,
// shuning uchun ular ichida qilingan Funksiya e'lonlarini ko'ra olmaymiz.
welcome(); // Xato: welcome aniqlanmagan
welcome ni if dan tashqarida koârinadigan qilish uchun nima qilishimiz mumkin?
Toâgâri yondashuv Funksiya ifodasidan foydalanish va welcome ni if dan tashqarida eâlon qilingan va tegishli koârinishga ega oâzgaruvchiga tayinlash boâladi.
Bu kod moâljallanganidek ishlaydi:
let age = prompt("Yoshingiz necha?", 18);
let welcome;
if (age < 18) {
welcome = function() {
alert("Salom!");
};
} else {
welcome = function() {
alert("Assalomu alaykum!");
};
}
welcome(); // endi yaxshi
Yoki biz uni savol belgisi operatori ? yordamida yanada soddalashtirishimiz mumkin:
let age = prompt("Yoshingiz necha?", 18);
let welcome = (age < 18) ?
function() { alert("Salom!"); } :
function() { alert("Assalomu alaykum!"); };
welcome(); // endi yaxshi
Qoida sifatida, funksiya eâlon qilish kerak boâlganda, birinchi navbatda Funksiya eâloni sintaksisini koârib chiqish kerak. Bu bizga kodimizni qanday tashkil qilishda koâproq erkinlik beradi, chunki biz bunday funksiyalarni ular eâlon qilinishidan oldin chaqirishimiz mumkin.
Bu oâqish uchun ham yaxshiroq, chunki kodda function f(â¦) {â¦} ni qidirish let f = function(â¦) {â¦}; dan osonroq. Funksiya eâlonlari koâproq âkoâzga tashlanadiganâ.
â¦Lekin agar Funksiya eâloni qandaydir sabab bilan bizga mos kelmasa yoki bizga shartli eâlon kerak boâlsa (biz hozirgina misolni koârdik), u holda Funksiya ifodasidan foydalanish kerak.
Xulosa
- Funksiyalar qiymatlardir. Ular kodni istalgan joyida tayinlanishi, nusxalanishi yoki eâlon qilinishi mumkin.
- Agar funksiya asosiy kod oqimida alohida ifoda sifatida eâlon qilinsa, bu âFunksiya eâloniâ deb ataladi.
- Agar funksiya ifodaning qismi sifatida yaratilsa, bu âFunksiya ifodasiâ deb ataladi.
- Funksiya eâlonlari kod bloki bajarilishidan oldin qayta ishlanadi. Ular blokda hamma joyda koârinadi.
- Funksiya ifodalari bajarilish oqimi ularga yetganda yaratiladi.
Koâpchilik hollarda funksiya eâlon qilish kerak boâlganda, Funksiya eâloni afzalroq, chunki u eâlonning oâzidan oldin koârinadi. Bu bizga kod tashkilotida koâproq moslashuvchanlik beradi va odatda oâqish uchun qulayroq.
Shuning uchun biz Funksiya ifodasidan faqat Funksiya eâloni vazifa uchun mos kelmaganida foydalanishimiz kerak. Biz bu bobda bundan bir nechta misollarni koârdik va kelajakda koâproq koâramiz.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)