Fungsi adalah inti dari JavaScript. Setelah menguasai dasar seperti deklarasi, parameter, dan arrow function, langkah berikutnya adalah memahami pola fungsi lanjutan yang sering digunakan oleh developer profesional.
Bab ini akan membahas advanced functions, functional programming patterns, dan trik-trik untuk menulis kode lebih modular, efisien, dan maintainable.
Contents
1. Higher-Order Functions (HOF)
Higher-Order Functions adalah fungsi yang dapat menerima fungsi lain sebagai argumen atau mengembalikan fungsi. Konsep ini menjadi fondasi banyak pola fungsional di JavaScript.
// Contoh HOF: map menerima fungsi sebagai argumen
const numbers = [1, 2, 3, 4];
const squared = numbers.map(num => num ** 2);
console.log(squared); // [1, 4, 9, 16]
Kegunaan HOF:
- Mengurangi duplikasi kode
- Membuat abstraksi algoritma lebih fleksibel
- Membantu menerapkan functional programming patterns
Contoh lain:
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
repeat(3, console.log);
// Output: 0, 1, 2
2. Currying & Partial Application
Currying adalah teknik mengubah fungsi dengan banyak argumen menjadi fungsi berantai yang menerima satu argumen tiap kali.
Partial Application adalah teknik membuat fungsi baru dari fungsi yang ada dengan beberapa argumen tetap.
// Currying
function multiply(a) {
return function(b) {
return a * b;
};
}
const double = multiply(2);
console.log(double(5)); // 10
// Partial application
function add(a, b, c) {
return a + b + c;
}
const add5And = add.bind(null, 5);
console.log(add5And(3, 2)); // 10
Manfaat:
- Mempermudah reuse fungsi
- Mempermudah composition (menggabungkan fungsi kecil menjadi kompleks)
3. Function Composition
Function composition adalah teknik menggabungkan beberapa fungsi menjadi satu, sehingga output fungsi sebelumnya menjadi input fungsi berikutnya.
const compose = (f, g) => x => f(g(x));
const double = x => x * 2;
const increment = x => x + 1;
const doubleThenIncrement = compose(increment, double);
console.log(doubleThenIncrement(3)); // 7
Manfaat:
- Membuat pipeline transformasi data yang jelas
- Mengurangi state global & side effect
4. IIFE (Immediately Invoked Function Expression)
IIFE adalah fungsi yang langsung dijalankan saat didefinisikan. Berguna untuk membuat scope lokal tanpa menambahkan variabel global.
(function() {
const message = "Hello from IIFE!";
console.log(message);
})();
// message tidak bisa diakses di luar IIFE
Manfaat:
- Menghindari konflik variabel global
- Mengisolasi modul kecil
- Berguna sebelum ES6 module tersedia
5. Memoization & Caching Function Results
Memoization adalah teknik menyimpan hasil fungsi yang sudah dihitung agar tidak perlu menghitung ulang, berguna untuk fungsi berbiaya tinggi.
function fibonacci(n, memo = {}) {
if (n in memo) return memo[n];
if (n <= 1) return n;
memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo);
return memo[n];
}
console.log(fibonacci(50)); // Cepat tanpa stack overflow
Manfaat:
- Meningkatkan performa aplikasi
- Mengurangi waktu eksekusi fungsi kompleks
6. Tips dan Best Practices Advanced Functions
- Gunakan arrow function untuk fungsi singkat tapi jangan sembarangan untuk methods yang butuh
this. - Prefer pure function agar mudah diuji dan di-maintain.
- Gunakan HOF & currying untuk membuat kode reusable.
- Hindari side effects di fungsi, terutama untuk state global.
- Dokumentasikan fungsi kompleks agar tim mudah memahami alur logika.
Kesimpulan
Menguasai advanced functions & patterns akan meningkatkan kemampuanmu menulis kode lebih modular, reusable, dan maintainable. Konsep seperti Higher-Order Function, Currying, Function Composition, IIFE, dan Memoization adalah pondasi yang sering digunakan dalam framework modern, functional programming, dan proyek-proyek produksi besar.
Langkah selanjutnya setelah menguasai bab ini adalah memahami advanced object patterns, modular programming, dan async patterns, yang akan dibahas di bab berikutnya.