JavaScript Yuqori Tartibli Funksiyalar(Higher Order Functions)

JavaScript-da yuqori tartibli funksiyalar haqida tushuncha va ularning qanday ishlatilishini o'rganing.

So'nggi yangilanish: 2024-12-18

Yuqori tartibli funksiyalar (Higher Order Functions) JavaScript dasturlash tilining kuchli va moslashuvchan xususiyatlaridan biridir. Ular funksional dasturlashning asosiy tushunchalaridan biri bo'lib, kodning qayta ishlatilishi, abstraksiya va modullikni oshirish imkonini beradi. Ushbu qo'llanma yuqori tartibli funksiyalarning mohiyatini, ularning foydalanish holatlarini va JavaScript dasturlashda qanday qo'llanilishini tushuntirishga qaratilgan.

Yuqori Tartibli Funksiyalar Nima?

Yuqori tartibli funksiya (Higher Order Function) - bu quyidagi xususiyatlardan kamida bittasiga ega bo'lgan funksiya:

  1. Bir yoki bir nechta funksiyalarni argument sifatida qabul qiladi.
  2. Funksiyani natija sifatida qaytaradi.

Bu tushuncha funksiyalarni "birinchi darajali fuqarolar" (first-class citizens) sifatida ko'rib chiqish imkonini beradi, ya'ni funksiyalar boshqa ma'lumot turlari kabi ishlatilishi mumkin.

Yuqori Tartibli Funksiyalarning Asosiy Turlari

  1. Funksiyani argument sifatida qabul qiluvchi funksiyalar:
function bajar(fn, a, b) {
  return fn(a, b);
}

function qoshish(x, y) {
  return x + y;
}

console.log(bajar(qoshish, 5, 3)); // 8
Albatta, men sizga Higher Order Functions (Yuqori Tartibli Funksiyalar) mavzusida keng qamrovli qo'llanma tayyorlayman.
  1. Funksiyani qaytaruvchi funksiyalar:
function kopaytiruvchiYaratish(n) {
  return function(x) {
    return x * n;
  };
}

const ikkilovchi = kopaytiruvchiYaratish(2);
console.log(ikkilovchi(5)); // 10

Funksiyalarni Argument Sifatida Uzatish

Funksiyalarni argument sifatida uzatish yuqori tartibli funksiyalarning eng keng tarqalgan foydalanish usullaridan biridir. Bu usul kodning moslashuvchanligini oshiradi va abstraksiya darajasini ko'taradi.

function har_bir_element_uchun(massiv, callback) {
  for (let i = 0; i < massiv.length; i++) {
    callback(massiv[i], i, massiv);
  }
}

const sonlar = [1, 2, 3, 4, 5];

har_bir_element_uchun(sonlar, function(element) {
  console.log(element * 2);
});
// Natija:
// 2
// 4
// 6
// 8
// 10

Funksiyalarni Qaytarish

Funksiyani qaytarish yuqori tartibli funksiyalarning yana bir muhim xususiyatidir. Bu usul funksiyalarni dinamik ravishda yaratish va sozlash imkonini beradi.

function salomBeruvchiYaratish(til) {
  if (til === "o'zbek") {
    return function(ism) {
      return `Salom, ${ism}!`;
    };
  } else if (til === "ingliz") {
    return function(ism) {
      return `Hello, ${ism}!`;
    };
  }
}

const uzbekchaSalom = salomBeruvchiYaratish("o'zbek");
const inglizchaSalom = salomBeruvchiYaratish("ingliz");

console.log(uzbekchaSalom("Ali")); // Salom, Ali!
console.log(inglizchaSalom("John")); // Hello, John!

Closure va Yuqori Tartibli Funksiyalar

Closure (yopilish) tushunchasi yuqori tartibli funksiyalar bilan chambarchas bog'liq. Closure funksiyaga o'zining yaratilgan muhitidagi o'zgaruvchilarga kirish imkonini beradi, hatto funksiya boshqa kontekstda bajarilganda ham.

function hisoblagichYaratish() {
  let sanoq = 0;
  return function() {
    sanoq++;
    return sanoq;
  };
}

const hisoblagich = hisoblagichYaratish();
console.log(hisoblagich()); // 1
console.log(hisoblagich()); // 2
console.log(hisoblagich()); // 3

Amaliy Misollar

  1. Funksiya kompozitsiyasi:
function kompozitsiya(f, g) {
  return function(x) {
    return f(g(x));
  };
}

const ikkilovchi = x => x * 2;
const kvadrat = x => x * x;

const ikkilabKvadrat = kompozitsiya(kvadrat, ikkilovchi);
console.log(ikkilabKvadrat(3)); // 36 (3 * 2 = 6, 6 * 6 = 36)
  1. Partial application (qisman qo'llash):
function qismanQollash(fn, ...dastlabkiArgumentlar) {
  return function(...qolganArgumentlar) {
    return fn(...dastlabkiArgumentlar, ...qolganArgumentlar);
  };
}

function qoshish(a, b, c) {
  return a + b + c;
}

const beshQosh = qismanQollash(qoshish, 5);
console.log(beshQosh(10, 15)); // 30

Yuqori Tartibli Funksiyalar va Massiv Metodlari

JavaScript'da ko'plab o'rnatilgan massiv metodlari yuqori tartibli funksiyalardir. Ular massivlar bilan ishlashni ancha soddalashtirib, kodning o'qilishini yaxshilaydi.

  1. map():
const sonlar = [1, 2, 3, 4, 5];
const kvadratlar = sonlar.map(son => son * son);
console.log(kvadratlar); // [1, 4, 9, 16, 25]
  1. filter():
const sonlar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const juftSonlar = sonlar.filter(son => son % 2 === 0);
console.log(juftSonlar); // [2, 4, 6, 8, 10]
  1. reduce():
const sonlar = [1, 2, 3, 4, 5];
const yigindi = sonlar.reduce((akkumulator, joriy) => akkumulator + joriy, 0);
console.log(yigindi); // 15

Yuqori Tartibli Funksiyalar va Asinxron Dasturlash

Yuqori tartibli funksiyalar asinxron dasturlashda ham keng qo'llaniladi, ayniqsa callback funksiyalar va Promise'lar bilan ishlashda.

function vaqtUtgachBajar(vaqt, callback) {
  setTimeout(callback, vaqt);
}

vaqtUtgachBajar(2000, () => {
  console.log("2 soniyadan so'ng bajarildi");
});

// Promise bilan
function vaqtUtgachBajarPromise(vaqt) {
  return new Promise(resolve => {
    setTimeout(resolve, vaqt);
  });
}

vaqtUtgachBajarPromise(2000).then(() => {
  console.log("2 soniyadan so'ng bajarildi (Promise bilan)");
});

Funksional Dasturlash Paradigmasi

Yuqori tartibli funksiyalar funksional dasturlash paradigmasining asosiy tushunchalaridan biridir. Ular sof funksiyalar (pure functions), o'zgarmaslik (immutability) va deklarativ dasturlash kabi boshqa funksional dasturlash tamoyillari bilan birgalikda ishlatiladi.

// Sof funksiya misoli
function qoshish(a, b) {
  return a + b;
}

// O'zgarmas ma'lumotlar tuzilmasi misoli
const boshlangichHolat = { sanoq: 0 };
function sanoqniOshirish(holat) {
  return { ...holat, sanoq: holat.sanoq + 1 };
}

const yangiHolat = sanoqniOshirish(boshlangichHolat);
console.log(boshlangichHolat); // { sanoq: 0 }
console.log(yangiHolat); // { sanoq: 1 }

Eng Yaxshi Amaliyotlar

  1. Funksiyalarni kichik va aniq vazifali qilib yarating.
  2. Sof funksiyalardan foydalaning (bir xil kirish uchun har doim bir xil natija).
  3. Funksiyalarni nomlaganda ularning vazifasini aniq ifodalang.
  4. Murakkab mantiqni soddalashtirishda yuqori tartibli funksiyalardan foydalaning.
  5. Funksional dasturlash tamoyillarini o'rganing va qo'llang.

Umumiy Xatolar va Ularning Yechimlari

  1. Xato: this kontekstini yo'qotish
const obyekt = {
  nom: "Misol",
  salomlash: function() {
    setTimeout(function() {
      console.log(`Salom, ${this.nom}`);
    }, 1000);
  }
};

obyekt.salomlash(); // Salom, undefined

Yechim: O'q funksiyasidan foydalanish yoki bind() metodini qo'llash

const obyekt = {
  nom: "Misol",
  salomlash: function() {
    setTimeout(() => {
      console.log(`Salom, ${this.nom}`);
    }, 1000);
  }
};

obyekt.salomlash(); // Salom, Misol
  1. Xato: Yuqori tartibli funksiyalarni haddan tashqari ishlatish

Yuqori tartibli funksiyalarni haddan tashqari ishlatish kodning murakkabligini oshirishi va o'qilishini qiyinlashtirishi mumkin.

Yechim: Muvozanatni saqlash va faqat kerak bo'lganda yuqori tartibli funksiyalardan foydalanish

Ishlash Samaradorligi Mulohazalari

  1. Yuqori tartibli funksiyalar qo'shimcha xotira sarflashi mumkin, ayniqsa closure'lar ishlatilganda.
  2. Katta massivlar bilan ishlashda map(), filter(), va reduce() kabi metodlarni ketma-ket qo'llash o'rniga, bitta reduce() metodidan foydalanish samaraliroq bo'lishi mumkin.
  3. Yuqori tartibli funksiyalar kodni optimallashtirishni qiyinlashtirishi mumkin, shuning uchun ishlash samaradorligi juda muhim bo'lgan joylarda ehtiyotkorlik bilan ishlatish kerak.

Tez-tez So'raladigan Savollar

  1. Savol: Yuqori tartibli funksiyalar va oddiy funksiyalar o'rtasidagi farq nima?

Javob: Yuqori tartibli funksiyalar boshqa funksiyalarni argument sifatida qabul qiladi yoki funksiyani qaytaradi. Oddiy funksiyalar esa bunday qilmaydi.

  1. Savol: Yuqori tartibli funksiyalar qachon ishlatilishi kerak? Javob: Yuqori tartibli funksiyalar quyidagi hollarda ishlatilishi kerak:

  2. Kodning qayta ishlatilishini oshirish uchun

  3. Abstraksiya darajasini ko'tarish uchun

  4. Funksional dasturlash tamoyillarini qo'llash uchun

  5. Murakkab mantiqni soddalashtirishda

  6. Savol: Closure va yuqori tartibli funksiyalar o'rtasida qanday bog'liqlik bor?

Javob: Closure yuqori tartibli funksiyalarning keng tarqalgan natijasi hisoblanadi. Yuqori tartibli funksiya boshqa funksiyani qaytarganda, qaytarilgan funksiya o'zining yaratilgan muhitidagi o'zgaruvchilarga kirish imkoniyatini saqlab qoladi, bu esa closure hisoblanadi.

  1. Savol: Yuqori tartibli funksiyalarning asosiy afzalliklari nimada?

Javob: Yuqori tartibli funksiyalarning asosiy afzalliklari:

  1. Kodning qayta ishlatilishini oshiradi
  2. Abstraksiya darajasini ko'taradi
  3. Kodni yanada moslashuvchan va kengaytiriladigan qiladi
  4. Funksional dasturlash tamoyillarini qo'llash imkonini beradi

Qo'shimcha Manbalar

  1. MDN Web Docs: Yuqori tartibli funksiyalar
  2. Eloquent JavaScript: Yuqori tartibli funksiyalar
  3. FunFunFunction: Yuqori tartibli funksiyalar
  4. JavaScript.info: Funksiyalar haqida chuqurroq