Koâpincha skriptning koâp joylarida oâxshash harakatni bajarishga toâgâri keladi.
Masalan, tashrif buyuruvchi tizimga kirganida, chiqganida va boshqa joylarda chiroyli koârinishdagi xabarni koârsatish kerak.
Funksiyalar dasturning asosiy "qurilish bloklari"dir. Ular kodni takrorlanmasdan koâp marta chaqirishga imkon beradi.
Biz allaqachon oârnatilgan funksiyalar misollarini koârdik, masalan alert(message), prompt(message, default) va confirm(question). Lekin biz oâz funksiyalarimizni ham yaratishimiz mumkin.
Funksiya eâloni
Funksiya yaratish uchun funksiya eâlonidan foydalanishimiz mumkin.
U quyidagicha koârinadi:
function showMessage() {
alert("Hammaga salom!");
}
function kalit soâzi birinchi oârinda turadi, keyin funksiya nomi, soângra qavslar orasida parametrlar roâyxati (vergul bilan ajratilgan, yuqoridagi misolda boâsh, keyinroq misollarni koâramiz) va nihoyat jingalak qavslar orasida funksiya kodi, âfunksiya tanasiâ deb ham ataladi.
function name(parameter1, parameter2, ...parameterN) {
// tana
}
Bizning yangi funksiyamizni nomi bilan chaqirish mumkin: showMessage().
Masalan:
function showMessage() {
alert( 'Hammaga salom!' );
}
showMessage();
showMessage();
showMessage() chaqiruvi funksiya kodini bajaradi. Bu yerda xabarni ikki marta koâramiz.
Bu misol funksiyalarning asosiy maqsadlaridan birini aniq koârsatadi: kod takrorlanishini oldini olish.
Agar xabar yoki uni koârsatish usulini oâzgartirishga hojat tugâilsa, kodni faqat bir joyda oâzgartirish kifoya: uni chiqaradigan funksiyada.
Mahalliy oâzgaruvchilar
Funksiya ichida eâlon qilingan oâzgaruvchi faqat oâsha funksiya ichida koârinadi.
Masalan:
function showMessage() {
let message = "Salom, men JavaScript!"; // mahalliy o'zgaruvchi
alert( message );
}
showMessage(); // Salom, men JavaScript!
alert( message ); // <-- Xato! O'zgaruvchi funksiyaga mahalliy
Tashqi oâzgaruvchilar
Funksiya tashqi oâzgaruvchiga ham kirishi mumkin, masalan:
let userName = 'John';
function showMessage() {
let message = 'Salom, ' + userName;
alert(message);
}
showMessage(); // Salom, John
Funksiya tashqi oâzgaruvchiga toâliq kirish huquqiga ega. U uni oâzgartirishi ham mumkin.
Masalan:
let userName = 'John';
function showMessage() {
userName = "Bob"; // (1) tashqi o'zgaruvchini o'zgartirdi
let message = 'Salom, ' + userName;
alert(message);
}
alert( userName ); // John funksiya chaqiruvidan oldin
showMessage();
alert( userName ); // Bob, qiymat funksiya tomonidan o'zgartirildi
Tashqi oâzgaruvchi faqat mahalliy yoâq boâlgan taqdirda ishlatiladi.
Agar bir xil nomli oâzgaruvchi funksiya ichida eâlon qilinsa, u tashqi oâzgaruvchini soyaga oladi. Masalan, quyidagi kodda funksiya mahalliy userName dan foydalanadi. Tashqi oâzgaruvchi eâtiborga olinmaydi:
let userName = 'John';
function showMessage() {
let userName = "Bob"; // mahalliy o'zgaruvchi e'lon qilish
let message = 'Salom, ' + userName; // Bob
alert(message);
}
// funksiya o'zining userName ini yaratadi va ishlatadi
showMessage();
alert( userName ); // John, o'zgarmagan, funksiya tashqi o'zgaruvchiga kirmagan
Har qanday funksiyadan tashqarida eâlon qilingan oâzgaruvchilar, yuqoridagi koddagi tashqi userName kabi, global deb ataladi.
Global oâzgaruvchilar har qanday funksiyadan koârinadi (mahalliy oâzgaruvchilar tomonidan soyaga olinmaguncha).
Global oâzgaruvchilardan foydalanishni kamaytirishning yaxshi amaliyotidir. Zamonaviy kodda kam yoki umuman global oâzgaruvchilar yoâq. Koâpchilik oâzgaruvchilar oâz funksiyalarida joylashadi. Baâzan ular loyiha darajasidagi maâlumotlarni saqlash uchun foydali boâlishi mumkin.
Parametrlar
Parametrlar yordamida funksiyalarga ixtiyoriy maâlumotlarni uzata olamiz.
Quyidagi misolda funksiyaning ikkita parametri bor: from va text.
function showMessage(from, text) { // parametrlar: from, text
alert(from + ': ' + text);
}
showMessage('Ann', 'Salom!'); // Ann: Salom! (*)
showMessage('Ann', "Qandaysiz?"); // Ann: Qandaysiz? (**)
Funksiya (*) va (**) qatorlarida chaqirilganda, berilgan qiymatlar mahalliy oâzgaruvchilar from va text ga nusxalanadi. Keyin funksiya ulardan foydalanadi.
Mana yana bir misol: bizda from oâzgaruvchisi bor va uni funksiyaga uzatamiz. Eâtibor bering: funksiya from ni oâzgartiradi, lekin oâzgarish tashqarida koârinmaydi, chunki funksiya har doim qiymatning nusxasini oladi:
function showMessage(from, text) {
from = '*' + from + '*'; // "from" ni chiroyliroq qilish
alert( from + ': ' + text );
}
let from = "Ann";
showMessage(from, "Salom"); // *Ann*: Salom
// "from" qiymati bir xil, funksiya mahalliy nusxani o'zgartirdi
alert( from ); // Ann
Qiymat funksiya parametri sifatida uzatilganda, u argument deb ham ataladi.
Boshqacha qilib aytganda, bu atamalarni toâgâri qoâyish uchun:
- Parametr â funksiya eâlonidagi qavslar ichida koârsatilgan oâzgaruvchi (bu eâlon vaqtidagi atama).
- Argument â funksiya chaqirilganda uzatiladigan qiymat (bu chaqiruv vaqtidagi atama).
Biz funksiyalarni parametrlarini koârsatib eâlon qilamiz, keyin argumentlarni uzatib chaqiramiz.
Yuqoridagi misolda shunday deyish mumkin: âshowMessage funksiyasi ikkita parametr bilan eâlon qilingan, keyin ikkita argument bilan chaqirilgan: from va "Salom"â.
Standart qiymatlar
Agar funksiya chaqirilsa, lekin argument berilmasa, tegishli qiymat undefined boâladi.
Masalan, yuqorida aytib oâtilgan showMessage(from, text) funksiyasini bitta argument bilan chaqirish mumkin:
showMessage("Ann");
Bu xato emas. Bunday chaqiruv "*Ann*: undefined" ni chiqaradi. text qiymati uzatilmagani uchun u undefined boâladi.
Funksiya eâlonida = yordamida parametr uchun âstandartâ (tashlab qoâyilsa ishlatish uchun) qiymatni belgilashimiz mumkin:
function showMessage(from, text = "matn berilmagan") {
alert( from + ": " + text );
}
showMessage("Ann"); // Ann: matn berilmagan
Endi agar text parametri uzatilmasa, u "matn berilmagan" qiymatini oladi.
Parametr mavjud boâlsa ham, lekin qatâiy ravishda undefined ga teng boâlsa ham standart qiymat ishlaydi:
showMessage("Ann", undefined); // Ann: matn berilmagan
Bu yerda "matn berilmagan" satr, lekin u yanada murakkab ifoda boâlishi mumkin, u faqat parametr yoâqolgan taqdirda baholanadi va tayinlanadi. Demak, bu ham mumkin:
function showMessage(from, text = anotherFunction()) {
// anotherFunction() faqat text berilmaganida bajariladi
// uning natijasi text qiymati bo'ladi
}
JavaScript-da standart parametr har safar tegishli parametrsiz funksiya chaqirilganda baholanadi.
Yuqoridagi misolda, agar text parametri berilsa, anotherFunction() umuman chaqirilmaydi.
Boshqa tomondan, text yoâqolgan har safar u mustaqil ravishda chaqiriladi.
Bir necha yil oldin JavaScript standart parametrlar sintaksisini qoâllab-quvvatlamagan edi. Shuning uchun odamlar ularni belgilashning boshqa usullarini ishlatganlar.
Hozir biz ularni eski skriptlarda uchratishimiz mumkin.
Masalan, undefined uchun aniq tekshiruv:
function showMessage(from, text) {
if (text === undefined) {
text = 'matn berilmagan';
}
alert( from + ": " + text );
}
â¦Yoki || operatoridan foydalanish:
function showMessage(from, text) {
// Agar text qiymati yolg'on bo'lsa, standart qiymatni tayinlash
// bu text == "" ni umuman matn yo'qligi bilan bir xil deb hisoblaydi
text = text || 'matn berilmagan';
...
}
Muqobil standart parametrlar
Baâzan funksiya eâlonidan keyin keyinroq parametrlar uchun standart qiymatlarni tayinlash mantiqan toâgâri keladi.
Funksiya bajarilishi davomida parametrning uzatilganligini undefined bilan solishtirib tekshirishimiz mumkin:
function showMessage(text) {
// ...
if (text === undefined) { // agar parametr yo'qolgan bo'lsa
text = 'bo\'sh xabar';
}
alert(text);
}
showMessage(); // bo'sh xabar
â¦Yoki || operatoridan foydalanishimiz mumkin:
function showMessage(text) {
// agar text undefined yoki boshqa yolg'on bo'lsa, uni 'bo'sh'ga o'rnatish
text = text || 'bo\'sh';
...
}
Zamonaviy JavaScript dvigatellari nullish coalescing operator ?? ni qoâllab-quvvatlaydi, bu 0 kabi koâpchilik yolgâon qiymatlar ânormalâ deb hisoblanishi kerak boâlganda yaxshiroqdir:
function showCount(count) {
// agar count undefined yoki null bo'lsa, "noma'lum"ni ko'rsatish
alert(count ?? "noma'lum");
}
showCount(0); // 0
showCount(null); // noma'lum
showCount(); // noma'lum
Qiymat qaytarish
Funksiya natija sifatida chaqiruvchi kodga qiymat qaytarishi mumkin.
Eng oddiy misol â ikkita qiymatni qoâshadigan funksiya:
function sum(a, b) {
return a + b;
}
let result = sum(1, 2);
alert( result ); // 3
return direktivasi funksiyaning istalgan joyida boâlishi mumkin. Bajarilish unga yetganda, funksiya toâxtaydi va qiymat chaqiruvchi kodga qaytariladi (yuqorida result ga tayinlangan).
Bitta funksiyada return ning koâplab holatlari boâlishi mumkin. Masalan:
function checkAge(age) {
if (age >= 18) {
return true;
} else {
return confirm('Ota-onangizdan ruxsat bormikan?');
}
}
let age = prompt('Yoshingiz nechada?', 18);
if ( checkAge(age) ) {
alert( 'Ruxsat berildi' );
} else {
alert( 'Ruxsat rad etildi' );
}
return ni qiymat boâlmagan holda ishlatish mumkin. Bu funksiyaning darhol chiqishiga sabab boâladi.
Masalan:
function showMovie(age) {
if ( !checkAge(age) ) {
return;
}
alert( "Sizga filmni ko'rsatamiz" ); // (*)
// ...
}
Yuqoridagi kodda, agar checkAge(age) false qaytarsa, showMovie alert ga oâtmaydi.
returnyoki uning yoâqligiundefinedqaytaradiAgar funksiya qiymat qaytarmasa, bu xuddiundefined qaytargani bilan bir xil:
function doNothing() {
/* bo'sh */
}
alert(doNothing() === undefined); // true
Boâsh return ham return undefined bilan bir xil:
function doNothing() {
return;
}
alert(doNothing() === undefined); // true
return va qiymat orasiga hech qachon yangi qator qoâshmangreturn da uzun ifoda uchun uni alohida qatorga qoâyish vasvasaga soladigan boâlishi mumkin:
return
(some + long + expression + or + whatever * f(a) + f(b))
Bu ishlamaydi, chunki JavaScript return dan keyin nuqta-vergul deb taxmin qiladi. Bu quyidagi bilan bir xil ishlaydi:
return;
(some + long + expression + or + whatever * f(a) + f(b))
Shunday qilib, u samarali ravishda boâsh return boâladi.
Agar qaytarilgan ifoda bir necha qatorga boâlinishini istasak, uni return bilan bir xil qatordan boshlashimiz kerak. Yoki kamida ochilish qavslarini quyidagicha qoâyishimiz kerak:
return (
some + long + expression
+ or +
whatever * f(a) + f(b)
)
Va u biz kutganimizdek ishlaydi.
Funksiyani nomlash
Funksiyalar harakatlardir. Shuning uchun ularning nomi odatda feâl boâladi. U qisqa, imkon qadar aniq va funksiya nima qilishini tasvirlab berishi kerak, shunda kodni oâqiyotgan kishi funksiya nima qilishini tushunadi.
Harakat haqida taxminan tasvirlaydigan feâl prefiksi bilan funksiyani boshlash keng tarqalgan amaliyotdir. Jamoada prefikslar maânosi haqida kelishuv boâlishi kerak.
Masalan, "show" bilan boshlanadigan funksiyalar odatda biror narsani koârsatadi.
Funksiya boshlanganâ¦
"getâ¦"â qiymat qaytaradi,"calcâ¦"â biror narsani hisoblaydi,"createâ¦"â biror narsa yaratadi,"checkâ¦"â biror narsani tekshiradi va boolean qaytaradi, va hokazo.
Bunday nomlar misollari:
showMessage(..) // xabar ko'rsatadi
getAge(..) // yoshni qaytaradi (qandaydir usul bilan oladi)
calcSum(..) // yig'indini hisoblaydi va natijani qaytaradi
createForm(..) // forma yaratadi (va odatda uni qaytaradi)
checkPermission(..) // ruxsatni tekshiradi, true/false qaytaradi
Prefikslar oârnida, funksiya nomiga bir nazar tashlash uning qanday ish qilishini va qanday qiymat qaytarishini tushunishga imkon beradi.
Funksiya aynan nomida aytilgan narsani qilishi kerak, undan ortiq emas.
Ikki mustaqil harakat odatda ikkita funksiyani talab qiladi, hatto ular odatda birga chaqirilsa ham (bu holda biz oâsha ikkisini chaqiradigan 3-funksiya yasashimiz mumkin).
Bu qoidani buzishning bir necha misoli:
getAgeâ agar u yoshnialertbilan koârsatsa yomon boâladi (faqat olishi kerak).createFormâ agar u hujjatni oâzgartirsa, unga forma qoâshsa yomon boâladi (faqat yaratishi va qaytarishi kerak).checkPermissionâ agar uruxsat berildi/rad etildixabarini koârsatsa yomon boâladi (faqat tekshirishi va natijani qaytarishi kerak).
Bu misollar prefikslarning umumiy maânolarini nazarda tutadi. Siz va jamoangiz boshqa maânolar haqida kelishishingiz mumkin, lekin odatda ular unchalik farq qilmaydi. Har qanday holatda, prefiks nimani anglatishi, prefiksli funksiya nima qila olishi va nima qila olmasligi haqida aniq tushunchaga ega boâlishingiz kerak. Barcha bir xil prefiksli funksiyalar qoidalarga boâysunishi kerak. Va jamoa bilimni boâlishishi kerak.
Funksiyalar == Sharhlar
Funksiyalar qisqa va aynan bitta ishni qilishi kerak. Agar bu ish katta boâlsa, funksiyani bir nechta kichikroq funksiyalarga boâlish arziydi. Baâzan bu qoidaga amal qilish oson boâlmasligi mumkin, lekin bu albatta yaxshi narsa.
Alohida funksiya nafaqat sinovdan oâtkazish va disk raskadka qilish osonroq â uning mavjudligi oâzi ajoyib sharh!
Masalan, quyidagi ikkita showPrimes(n) funksiyasini solishtiring. Har biri n gacha tub sonlarni chiqaradi.
Birinchi variant yorliq ishlatadi:
function showPrimes(n) {
nextPrime: for (let i = 2; i < n; i++) {
for (let j = 2; j < i; j++) {
if (i % j == 0) continue nextPrime;
}
alert(i); // tub son
}
}
Ikkinchi variant tublikni tekshirish uchun qoâshimcha isPrime(n) funksiyasidan foydalanadi:
function showPrimes(n) {
for (let i = 2; i < n; i++) {
if (!isPrime(i)) continue;
alert(i); // tub son
}
}
function isPrime(n) {
for (let i = 2; i < n; i++) {
if ( n % i == 0) return false;
}
return true;
}
Ikkinchi variant tushunish osonroq, shunday emasmi? Kod qismi oârniga biz harakat nomini koâramiz (isPrime). Baâzan odamlar bunday kodni oâz-oâzini tavsiflovchi deb atashadi.
Shunday qilib, funksiyalarni qayta ishlatishni niyat qilmasak ham yaratish mumkin. Ular kodni strukturalashtiradi va oâqishga qulay qiladi.
Xulosa
Funksiya eâloni quyidagicha koârinadi:
function name(vergul, bilan, ajratilgan, parametrlar) {
/* kod */
}
- Funksiyaga parametr sifatida uzatilgan qiymatlar uning mahalliy oâzgaruvchilariga nusxalanadi.
- Funksiya tashqi oâzgaruvchilarga kirishi mumkin. Lekin u faqat ichkaridan tashqariga ishlaydi. Funksiyadan tashqaridagi kod uning mahalliy oâzgaruvchilarini koârmaydi.
- Funksiya qiymat qaytarishi mumkin. Agar qaytarmasa, uning natijasi
undefinedboâladi.
Kodni toza va tushunish oson qilish uchun funksiyada asosan mahalliy oâzgaruvchilar va parametrlardan foydalanish tavsiya etiladi, tashqi oâzgaruvchilardan emas.
Parametrlar oladigan, ular bilan ishlaydigan va natija qaytaradigan funksiyani tushunish har doim parametr olmaydigan, lekin yon taâsir sifatida tashqi oâzgaruvchilarni oâzgartiradigan funksiyadan osondir.
Funksiyani nomlash:
- Nom funksiya nima qilishini aniq tasvirlashi kerak. Kodda funksiya chaqiruvini koârganimizda, yaxshi nom bizga u nima qilishi va qaytarishini darhol tushuntirib beradi.
- Funksiya harakat, shuning uchun funksiya nomlari odatda feâldir.
createâ¦,showâ¦,getâ¦,checkâ¦va boshqa koâplab taniqli funksiya prefikslari mavjud. Funksiya nima qilishini bildirish uchun ulardan foydalaning.
Funksiyalar skriptlarning asosiy qurilish bloklaridir. Endi biz asoslarni koârib chiqdik, shuning uchun aslida ularni yaratish va ishlatishni boshlashimiz mumkin. Lekin bu yoâlning faqat boshlanishi. Biz ularga koâp marta qaytamiz va ularning ilgâor xususiyatlarini chuqurroq oârganamiz.
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â¦)