[ Web Proxy ]
URL:
Viewing: https://uz.javascript.info/function-basics [Back]  [Original]

Funksiyalar
UZ

Ushbu ochiq manbali loyihani butun dunyo bo'ylab odamlar uchun taqdim etmoqchimiz.

Ushbu qo'llanmaning mazmuni sizning tilingizga tarjima qilishga yordam bering!

    Javascript.info saytidan qidirish:
    O'quv qo'llanmasidan qidiring:
    Light themeDark theme
    DanskEnglishEspaolFranaisIndonesiaItalianoTrkeOzbek

    Kopincha skriptning kop joylarida oxshash harakatni bajarishga togri keladi.

    Masalan, tashrif buyuruvchi tizimga kirganida, chiqganida va boshqa joylarda chiroyli korinishdagi xabarni korsatish kerak.

    Funksiyalar dasturning asosiy "qurilish bloklari"dir. Ular kodni takrorlanmasdan kop marta chaqirishga imkon beradi.

    Biz allaqachon ornatilgan funksiyalar misollarini kordik, masalan alert(message), prompt(message, default) va confirm(question). Lekin biz oz funksiyalarimizni ham yaratishimiz mumkin.

    Funksiya eloni

    Funksiya yaratish uchun funksiya elonidan foydalanishimiz mumkin.

    U quyidagicha korinadi:

    function showMessage() {
      alert("Hammaga salom!");
    }

    function kalit sozi birinchi orinda turadi, keyin funksiya nomi, songra qavslar orasida parametrlar royxati (vergul bilan ajratilgan, yuqoridagi misolda bosh, keyinroq misollarni koramiz) 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 koramiz.

    Bu misol funksiyalarning asosiy maqsadlaridan birini aniq korsatadi: kod takrorlanishini oldini olish.

    Agar xabar yoki uni korsatish usulini ozgartirishga hojat tugilsa, kodni faqat bir joyda ozgartirish kifoya: uni chiqaradigan funksiyada.

    Mahalliy ozgaruvchilar

    Funksiya ichida elon qilingan ozgaruvchi faqat osha funksiya ichida korinadi.

    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 ozgaruvchilar

    Funksiya tashqi ozgaruvchiga ham kirishi mumkin, masalan:

    let userName = 'John';
    
    function showMessage() {
      let message = 'Salom, ' + userName;
      alert(message);
    }
    
    showMessage(); // Salom, John

    Funksiya tashqi ozgaruvchiga toliq kirish huquqiga ega. U uni ozgartirishi 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 ozgaruvchi faqat mahalliy yoq bolgan taqdirda ishlatiladi.

    Agar bir xil nomli ozgaruvchi funksiya ichida elon qilinsa, u tashqi ozgaruvchini soyaga oladi. Masalan, quyidagi kodda funksiya mahalliy userName dan foydalanadi. Tashqi ozgaruvchi etiborga 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
    Global ozgaruvchilar

    Har qanday funksiyadan tashqarida elon qilingan ozgaruvchilar, yuqoridagi koddagi tashqi userName kabi, global deb ataladi.

    Global ozgaruvchilar har qanday funksiyadan korinadi (mahalliy ozgaruvchilar tomonidan soyaga olinmaguncha).

    Global ozgaruvchilardan foydalanishni kamaytirishning yaxshi amaliyotidir. Zamonaviy kodda kam yoki umuman global ozgaruvchilar yoq. Kopchilik ozgaruvchilar oz funksiyalarida joylashadi. Bazan ular loyiha darajasidagi malumotlarni saqlash uchun foydali bolishi mumkin.

    Parametrlar

    Parametrlar yordamida funksiyalarga ixtiyoriy malumotlarni 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 ozgaruvchilar from va text ga nusxalanadi. Keyin funksiya ulardan foydalanadi.

    Mana yana bir misol: bizda from ozgaruvchisi bor va uni funksiyaga uzatamiz. Etibor bering: funksiya from ni ozgartiradi, lekin ozgarish tashqarida korinmaydi, 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 togri qoyish uchun:

    • Parametr funksiya elonidagi qavslar ichida korsatilgan ozgaruvchi (bu elon vaqtidagi atama).
    • Argument funksiya chaqirilganda uzatiladigan qiymat (bu chaqiruv vaqtidagi atama).

    Biz funksiyalarni parametrlarini korsatib elon qilamiz, keyin argumentlarni uzatib chaqiramiz.

    Yuqoridagi misolda shunday deyish mumkin: showMessage funksiyasi ikkita parametr bilan elon qilingan, keyin ikkita argument bilan chaqirilgan: from va "Salom".

    Standart qiymatlar

    Agar funksiya chaqirilsa, lekin argument berilmasa, tegishli qiymat undefined boladi.

    Masalan, yuqorida aytib otilgan 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 boladi.

    Funksiya elonida = yordamida parametr uchun standart (tashlab qoyilsa 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 bolsa ham, lekin qatiy ravishda undefined ga teng bolsa ham standart qiymat ishlaydi:

    showMessage("Ann", undefined); // Ann: matn berilmagan

    Bu yerda "matn berilmagan" satr, lekin u yanada murakkab ifoda bolishi mumkin, u faqat parametr yoqolgan taqdirda baholanadi va tayinlanadi. Demak, bu ham mumkin:

    function showMessage(from, text = anotherFunction()) {
      // anotherFunction() faqat text berilmaganida bajariladi
      // uning natijasi text qiymati bo'ladi
    }
    Standart parametrlarni baholash

    JavaScript-da standart parametr har safar tegishli parametrsiz funksiya chaqirilganda baholanadi.

    Yuqoridagi misolda, agar text parametri berilsa, anotherFunction() umuman chaqirilmaydi.

    Boshqa tomondan, text yoqolgan har safar u mustaqil ravishda chaqiriladi.

    Eski JavaScript kodidagi standart parametrlar

    Bir necha yil oldin JavaScript standart parametrlar sintaksisini qollab-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

    Bazan funksiya elonidan keyin keyinroq parametrlar uchun standart qiymatlarni tayinlash mantiqan togri 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 qollab-quvvatlaydi, bu 0 kabi kopchilik yolgon qiymatlar normal deb hisoblanishi kerak bolganda 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 qoshadigan funksiya:

    function sum(a, b) {
      return a + b;
    }
    
    let result = sum(1, 2);
    alert( result ); // 3

    return direktivasi funksiyaning istalgan joyida bolishi mumkin. Bajarilish unga yetganda, funksiya toxtaydi va qiymat chaqiruvchi kodga qaytariladi (yuqorida result ga tayinlangan).

    Bitta funksiyada return ning koplab holatlari bolishi 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 bolmagan holda ishlatish mumkin. Bu funksiyaning darhol chiqishiga sabab boladi.

    Masalan:

    function showMovie(age) {
      if ( !checkAge(age) ) {
        return;
      }
    
      alert( "Sizga filmni ko'rsatamiz" ); // (*)
      // ...
    }

    Yuqoridagi kodda, agar checkAge(age) false qaytarsa, showMovie alert ga otmaydi.

    Bosh returnyoki uning yoqligiundefinedqaytaradi

    Agar funksiya qiymat qaytarmasa, bu xuddiundefined qaytargani bilan bir xil:

    function doNothing() {
      /* bo'sh */
    }
    
    alert(doNothing() === undefined); // true

    Bosh return ham return undefined bilan bir xil:

    function doNothing() {
      return;
    }
    
    alert(doNothing() === undefined); // true
    return va qiymat orasiga hech qachon yangi qator qoshmang

    return da uzun ifoda uchun uni alohida qatorga qoyish vasvasaga soladigan bolishi 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 bosh return boladi.

    Agar qaytarilgan ifoda bir necha qatorga bolinishini istasak, uni return bilan bir xil qatordan boshlashimiz kerak. Yoki kamida ochilish qavslarini quyidagicha qoyishimiz 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 fel boladi. U qisqa, imkon qadar aniq va funksiya nima qilishini tasvirlab berishi kerak, shunda kodni oqiyotgan kishi funksiya nima qilishini tushunadi.

    Harakat haqida taxminan tasvirlaydigan fel prefiksi bilan funksiyani boshlash keng tarqalgan amaliyotdir. Jamoada prefikslar manosi haqida kelishuv bolishi kerak.

    Masalan, "show" bilan boshlanadigan funksiyalar odatda biror narsani korsatadi.

    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 ornida, funksiya nomiga bir nazar tashlash uning qanday ish qilishini va qanday qiymat qaytarishini tushunishga imkon beradi.

    Bitta funksiya bitta harakat

    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 osha ikkisini chaqiradigan 3-funksiya yasashimiz mumkin).

    Bu qoidani buzishning bir necha misoli:

    • getAge agar u yoshni alert bilan korsatsa yomon boladi (faqat olishi kerak).
    • createForm agar u hujjatni ozgartirsa, unga forma qoshsa yomon boladi (faqat yaratishi va qaytarishi kerak).
    • checkPermission agar u ruxsat berildi/rad etildi xabarini korsatsa yomon boladi (faqat tekshirishi va natijani qaytarishi kerak).

    Bu misollar prefikslarning umumiy manolarini nazarda tutadi. Siz va jamoangiz boshqa manolar 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 bolishingiz kerak. Barcha bir xil prefiksli funksiyalar qoidalarga boysunishi kerak. Va jamoa bilimni bolishishi kerak.

    Ota qisqa funksiya nomlari

    Juda tez-tez ishlatiladigan funksiyalar bazan ota qisqa nomlarga ega.

    Masalan, jQuery freymvorki $ bilan funksiya aniqlaydi. Lodash kutubxonasining asosiy funksiyasi _ deb nomlangan.

    Bular istisnolar. Umuman funksiya nomlari qisqa va tavsiflovchi bolishi kerak.

    Funksiyalar == Sharhlar

    Funksiyalar qisqa va aynan bitta ishni qilishi kerak. Agar bu ish katta bolsa, funksiyani bir nechta kichikroq funksiyalarga bolish arziydi. Bazan bu qoidaga amal qilish oson bolmasligi mumkin, lekin bu albatta yaxshi narsa.

    Alohida funksiya nafaqat sinovdan otkazish va disk raskadka qilish osonroq uning mavjudligi ozi 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 qoshimcha 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 orniga biz harakat nomini koramiz (isPrime). Bazan odamlar bunday kodni oz-ozini tavsiflovchi deb atashadi.

    Shunday qilib, funksiyalarni qayta ishlatishni niyat qilmasak ham yaratish mumkin. Ular kodni strukturalashtiradi va oqishga qulay qiladi.

    Xulosa

    Funksiya eloni quyidagicha korinadi:

    function name(vergul, bilan, ajratilgan, parametrlar) {
      /* kod */
    }
    • Funksiyaga parametr sifatida uzatilgan qiymatlar uning mahalliy ozgaruvchilariga nusxalanadi.
    • Funksiya tashqi ozgaruvchilarga kirishi mumkin. Lekin u faqat ichkaridan tashqariga ishlaydi. Funksiyadan tashqaridagi kod uning mahalliy ozgaruvchilarini kormaydi.
    • Funksiya qiymat qaytarishi mumkin. Agar qaytarmasa, uning natijasi undefined boladi.

    Kodni toza va tushunish oson qilish uchun funksiyada asosan mahalliy ozgaruvchilar va parametrlardan foydalanish tavsiya etiladi, tashqi ozgaruvchilardan emas.

    Parametrlar oladigan, ular bilan ishlaydigan va natija qaytaradigan funksiyani tushunish har doim parametr olmaydigan, lekin yon tasir sifatida tashqi ozgaruvchilarni ozgartiradigan funksiyadan osondir.

    Funksiyani nomlash:

    • Nom funksiya nima qilishini aniq tasvirlashi kerak. Kodda funksiya chaqiruvini korganimizda, yaxshi nom bizga u nima qilishi va qaytarishini darhol tushuntirib beradi.
    • Funksiya harakat, shuning uchun funksiya nomlari odatda feldir.
    • create, show, get, check va boshqa koplab taniqli funksiya prefikslari mavjud. Funksiya nima qilishini bildirish uchun ulardan foydalaning.

    Funksiyalar skriptlarning asosiy qurilish bloklaridir. Endi biz asoslarni korib chiqdik, shuning uchun aslida ularni yaratish va ishlatishni boshlashimiz mumkin. Lekin bu yolning faqat boshlanishi. Biz ularga kop marta qaytamiz va ularning ilgor xususiyatlarini chuqurroq organamiz.

    Vazifalar

    Quyidagi funktsiya, agar age parametri 18 dan katta bolsa, true qiymatini qaytaradi.

    Aks holda u tasdiqlashni soraydi va natijasini qaytaradi:

    function checkAge(age) {
      if (age > 18) {
        return true;
      } else {
        // ...
        return confirm('Ota-onangiz sizga ruxsat berdimi?');
      }
    }

    Agar else ochirilsa, funktsiya boshqacha ishlaydimi?

    function checkAge(age) {
      if (age > 18) {
        return true;
      }
      // ...
      return confirm('Ota-onangiz sizga ruxsat berdimi?');
    }

    Ushbu ikkita variantning xatti-harakatlarida farq bormi?

    yechim

    Hech qanday farq yoq.

    Quyidagi funktsiya, agar age parametri 18 dan katta bolsa, true qiymatini qaytaradi.

    Aks holda u tasdiqlashni soraydi va natijasini qaytaradi.

    function checkAge(age) {
      if (age > 18) {
        return true;
      } else {
        return confirm(
          "Sizning ota-onangizdan ushbu sahifaga kirish uchun ruxsatingiz bormi?"
        );
      }
    }

    Xuddi shu narsani bajarish uchun uni qayta bitta satrda yozing, lekin if ni ishaltmang.

    checkAge ning ikkita variantini yarating:

    1. Savol belgisi operatoridan foydalaning ?
    2. YOKI || dan faoydalaning
    yechim

    '?' Savol belgisi operatoridan foydalanish:

    function checkAge(age) {
      return age > 18 ? true : confirm("Ota-onangiz sizga ruxsat berdimi?");
    }

    YOKI || (eng qisqa variant) dan foydalanish:

    function checkAge(age) {
      return (age > 18) || confirm('Ota-onangiz sizga ruxsat berdimi?'');
    }

    Shuni esda tutingki, bu erda age > 18 ga qavs kerak emas. Ular yaxshiroq oqilish uchun mavjud.

    Ikkala a va b sonning kickikini qaytaradigan min(a,b) funktsiyasini yozing.

    Masalan:

    min(2, 5) == 2;
    min(3, -1) == -1;
    min(1, 1) == 1;
    yechim

    If dan foydalangan holda echim:

    function min(a, b) {
      if (a < b) {
        return a;
      } else {
        return b;
      }
    }

    '?'Savol belgisi operatori bilan echim:

    function min(a, b) {
      return a < b ? a : b;
    }

    P.S. Tenglik holatida a == b nima qaytishi muhim emas.

    x ni n darajasiga chiqaradigan pow(x,n) funktsiyasini yozing. Yoki, boshqacha qilib aytganda, x ni oz-oziga n marta kopaytiradi va natijani qaytaradi.

    pow(3, 2) = 3 * 3 = 9
    pow(3, 3) = 3 * 3 * 3 = 27
    pow(1, 100) = 1 * 1 * ...* 1 = 1

    x va n soraladigan va keyin pow(x,n) natijasini korsatadigan veb-sahifa yarating.

    Namoyishni ishga tushirish

    P.S. Ushbu vazifada funktsiya faqat n ning natural qiymatlarini qollab-quvvatlashi kerak: 1 dan butun sonlar.

    yechim
    function pow(x, n) {
      let result = x;
    
      for (let i = 1; i < n; i++) {
        result *= x;
      }
    
      return result;
    }
    
    let x = prompt("x?", "");
    let n = prompt("n?", "");
    
    if (n < 1) {
      alert(`${n} darajasi quvvatlanmaydi,
         0 dan katta butun sondan foydalaning`);
    } else {
      alert(pow(x, n));
    }
    O'quv qo'llanma xaritasi

    Izohlar

    izoh berishdan oldin buni o'qing
    • Agar sizda nimani yaxshilash kerakligi haqida takliflaringiz bo'lsa - iltimos, GitHub muammosini yuboring yoki izoh berish o'rniga so'rov yuboring.
    • Agar siz maqolada biror narsani tushunolmasangiz - iltimos, batafsilroq ma'lumot bering.
    • Bir nechta so'z so'zlarini kiritish uchun <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)

    Web Proxy Viewer  |  New URL  |  Original Page