JavaScript’te “higher-order function” Kullanımı
JavaScript’te bir “higher-order function” (üst düzey fonksiyon), başka bir fonksiyonu argüman olarak alan veya bir fonksiyonu sonuç olarak döndüren fonksiyondur.
Bu kavram, fonksiyonel programlamanın temel bir özelliğidir ve JavaScript gibi birinci sınıf fonksiyonları destekleyen dillerde yaygın olarak kullanılır.
Başka Bir Fonksiyonu Argüman Olarak Almak
Bir üst düzey fonksiyon, başka bir fonksiyonu parametre olarak alabilir. Bu genellikle geri çağırma fonksiyonları (callbacks) ile yapılır. Örneğin, Array.prototype.map
, Array.prototype.filter
, ve Array.prototype.reduce
gibi yerleşik JavaScript fonksiyonları, her biri bir dizi üzerinde işlem yapmak için bir geri çağırma fonksiyonu alır. Örneğin:
const numbers = [1, 2, 3];
const doubled = numbers.map(number => number * 2);
// map bir higher-order function'dır.
Bir Fonksiyonu Sonuç Olarak Döndürmek
Bir üst düzey fonksiyon, başka bir fonksiyonu sonuç olarak döndürebilir. Genel olarak, kapsamı korumak, kısmi uygulama yapmak, veya “currying” gibi teknikler için kullanılır.
Kapsamı Koruma
Bir üst düzey fonksiyon, iç kapsamında tanımlanan değişkenlere erişimi olan başka bir fonksiyonu döndürebilir. Bu hem dış fonksiyonun değişkenlerinin yaşam süresini uzatır hem de iç fonksiyonun bu değişkenlere erişmesine olanak tanır. Örneğin:
function dışFonksiyon() {
let dışDeğişken = 'Ben dış değişkenim';
function içFonksiyon() {
return 'İç fonksiyon burada: ' + dışDeğişken;
}
return içFonksiyon;
}
let yeniFonksiyon = dışFonksiyon();
console.log(yeniFonksiyon()); // "İç fonksiyon burada: Ben dış değişkenim"
Kısmi Uygulama
Kısmi uygulama, bir fonksiyonun bazı argümanlarını sabitleyip, geriye kalan argümanları alacak yeni bir fonksiyon döndürmek için kullanılır. Haliyle, fonksiyonun yeniden kullanılabilirliği artar ve kod tekrarı önlenir.
function toplama(a, b) {
return a + b;
}
function kısmiUygulama(fn, a) {
return function(b) {
return fn(a, b);
};
}
const beşEkle = kısmiUygulama(toplama, 5);
console.log(beşEkle(10)); // 15
Currying
Currying, bir fonksiyonun birden fazla argümanını tek tek alan ve her seferinde yeni bir fonksiyon döndüren bir süreçtir. Örneğin:
function multiply(a) {
return function(b) {
return a * b;
};
}
const multiplyByTwo = multiply(2);
const multiplyByThree = multiply(3);
console.log(multiplyByTwo(4)); // 8 (2 * 4)
console.log(multiplyByThree(4)); // 12 (3 * 4)
Bu örnekte, multiply
fonksiyonu, başka bir fonksiyon döndürür. Bu döndürülen fonksiyon, multiply
‘nin aldığı ilk argümanı (a
) kapsar ve başka bir argüman (b
) alır. Sonuç olarak, multiplyByTwo
ve multiplyByThree
gibi yeni fonksiyonlar oluşturarak, multiply
fonksiyonunun yeniden kullanılabilirliğini ve esnekliğini artırabiliriz.