Yüksək səviyyəli funksiyalar (Higher Order Functions)
-
JavaScript proqramlaşdırma dilində yüksək səviyyəli funksiyalar (Higher Order Functions - HOF) böyük əhəmiyyətə malikdir. Bu funksiyalar başqa funksiyaları arqument kimi qəbul edə və ya nəticə olaraq yeni bir funksiya qaytara bilərlər. Bu yanaşma kodun çevikliyini artırır, abstraksiyaları qurmağa və funksional proqramlaşdırma prinsiplərini tətbiq etməyə imkan verir.
Bu məqalədə yüksək səviyyəli funksiyaların işləmə prinsipini başa düşmək üçün bir neçə nümunəyə baxacağıq.
1.
setTimeout()
– Yüksək səviyyəli funksiyaJavaScript-in qlobal
setTimeout()
funksiyası yüksək səviyyəli funksiyalara aid edilir, çünki o, bir funksiyanı arqument kimi qəbul edir və müəyyən müddət keçdikdən sonra icra edir.Aşağıdakı nümunədə
setTimeout()
funksiyası 5 saniyə sonra ekrana mesaj çıxarır:setTimeout( () => {console.log('Bax, mən buradayam!')}, 5000 )
Burada
setTimeout()
callback funksiyasını arqument kimi qəbul edir və müəyyən müddətdən sonra onu işlədir.
2.
map()
– Massivlərdə yüksək səviyyəli funksiyaJavaScript-də bir çox massiv metodları da yüksək səviyyəli funksiyalara aiddir. Bunlar sırasına
.map()
,.filter()
,.reduce()
və digər metodlar daxildir.Məsələn,
.map()
funksiyası bir callback funksiyasını arqument kimi qəbul edərək, massivdəki hər elementi dəyişdirən yeni bir massiv qaytarır:const years = [1970, 1990, 1995]; const objects = years.map(item => { return { year: item }; }); console.log(objects); // [ { year: 1970 }, { year: 1990 }, { year: 1995 } ]
Burada
.map()
funksiyasıitem
dəyişənini arqument kimi qəbul edir və hər birini obyekt formatına çevirən yeni bir massiv qaytarır.
3. Çoxistifadəli funksiyaların rahat qurulması
Yüksək səviyyəli funksiyalar “funksiyanı qismən tətbiq etmə” (Partial Application) prinsipindən istifadə etməyə imkan verir.
Bu yanaşmada bir funksiya bütün arqumentlərini dərhal qəbul etmək əvəzinə, əvvəlcə bir hissəsini qəbul edir və yeni bir funksiya qaytarır. Bu yeni funksiya qalan arqumentləri qəbul etdikdən sonra tam işləyir.
Gəlin bunu bir nümunə üzərində izah edək. Aşağıda məlumatların mənbəyini (source) göstərən sadə bir log funksiyası yaradaq:
const log = (sourceName, message) => { console.log(sourceName, ':', message); };
Bu funksiyanı işlədərkən hər dəfə mənbənin adını yazmaq lazımdır, bu isə qeyri-effektivdir:
log('Modul A', 'Başladı'); // Modul A: Başladı log('Modul A', 'Torpağın test edilməsi tamamlandı'); // Modul A: Torpağın test edilməsi tamamlandı
Hər dəfə
"Modul A"
yazmaq əvəzinə onu yadda saxlayan yeni bir funksiya yarada bilərik.Əgər bir funksiyanı elə yazsaq ki, o, əvvəlcə mənbə adını qəbul edib yeni bir funksiya qaytarsın, onda onu daha rahat istifadə edə bilərik:
// Yüksək səviyyəli funksiya - currying tətbiqi const log = sourceName => message => { console.log(sourceName, ':', message); };
İndi
log()
funksiyası birinci çağırışda mənbəni yadda saxlayır və ikinci çağırışda mesajı qəbul edərək nəticəni qaytarır:const logAppolo = log('Appolo 13'); logAppolo('Huston…'); // Appolo 13: Huston… logAppolo('Huston, problemimiz var'); // Appolo 13: Huston, problemimiz var
Bu yanaşma “currying” adlanır və funksional proqramlaşdırmada geniş istifadə edilir.
Nəticə
Yüksək səviyyəli funksiyalar JavaScript-də funksiyaları arqument kimi qəbul etmək və ya nəticə olaraq funksiyalar qaytarmaq imkanı verir. Bu, kodun modulyarlığını, çevikliyini və yenidən istifadə edilə bilməsini artırır.
Əsas üstünlükləri:
Callback funksiyaları ilə işləmək imkanı
Kodun təkrar istifadəsini artırır
Modulyar və daha rahat istifadə edilə bilən kod yazmağa kömək edir
Funksional proqramlaşdırma prinsiplərini tətbiq etməyə imkan yaradır
Əgər siz daha təmiz və funksional kod yazmaq istəyirsinizsə, yüksək səviyyəli funksiyalardan istifadə etməyi öyrənmək çox vacibdir!
Bilik paylaşdıqca artan bir sərvətdir