Higher-order function merupakan salah satu konsep paradigma pemrograman fungsional seperti pada bahasa pemrograman JavaScript.

Secara sederhana, higher-order function adalah sebuah fungsi yang digunakan sebagai argumen pada fungsi lainnya atau sebuah fungsi yang mengembalikan fungsi.

Jadinya seperti ini, deh. Sebuah fungsi yang digunakan sebagai argumen pada fungsi lain itu…

function bernyanyi() {
  console.log('Bernyanyi bernyanyi...')
}

function halo(callback) {
  console.log('Halo...')
  callback()
}

// masukkan fungsi bernyanyi sebagai argumen fungsi halo
halo(bernyanyi)

Hasilnya akan seperti apa?

Halo...
Bernyanyi bernyanyi...

Cara kerjanya, begini nih.

Pertama, saat fungsi halo dipanggil akan menampilkan Halo... dulu.

Kemudian ke baris selanjutnya, yaitu memanggil fungsi callback, yang mana callback ini merupakan fungsi bernyanyi yang disudah dibuat di atas. Setelah dipanggil akan ditampilkan Bernyanyi bernyanyi....

Kalian dapat memasukkan langsung sebuah fungsi pada fungsi lain tanpa mendeklarasikannya di atas.

function halo(callback) {
  console.log('Halo...')
  callback()
}

// masukkan anonymous function ke sini
halo(function () {
  console.log('Bernyanyi bernyanyi...')
})

Pada contoh kode di atas, aku tidak menamai fungsinya, jadinya ini disebut anonymous function atau fungsi anonim.

Biar enak dilihat, fungsi anonim tadi aku ubah menjadi arrow function.

function halo(callback) {
  console.log('Halo...')
  callback()
}

// masukkan arrow function ke sini
halo(() => console.log('Bernyanyi bernyanyi...'))

Kalau kode di atas dijalankan hasilnya akan sama seperti kode pertama di atas.

Oke, ayo kita coba implementasi salah satu higher-order function pada JavaScript, yaitu metode array forEach.

Pertama, buat fungsi sederhana untuk membuat perulangan array.

function forEach(array) {
  for (let i = 0; i < array.length; i++) {
    console.log(array[i])
  }
}

// tambahkan argumen array
forEach([1, 2, 3])

Hasilnya.

1
2
3

Kemudian tambahkan parameter callback pada fungsi forEach.

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

// tambahkan argumen array + callback function
forEach([1, 2, 3], (num) => {
  const sum = num + 10
  console.log(sum)
})

Hasilnya.

11
12
13

Lanjut ke higher-order function selanjutnya, yaitu fungsi yang mengembalikan fungsi.

Berikut ini contoh penerapan sederhananya.

function perkalian(num) {
  return function (x) {
    return num * x
  }
}

Fungsi perkalian yang berparameter num mengembalikan fungsi anonim berparameter x. Fungsi anonim tersebut dapat ditugaskan/disimpan ke sebuah variabel.

const kalikanDua = perkalian(2)

// cek isi dari variable kalikanDua
console.log(kalikanDua)

Hasilnya.

ƒ (x) {
    return num * x
  }

Tada~ variabel kalikanDua sekarang menjadi sebuah fungsi, sehingga bisa dijalankan layaknya fungsi pada umumnya.

kalikanDua(3) // 6
kalikanDua(4) // 8
kalikanDua(5) // 10

Ketika kalian menjalankan fungsi kalikanDua, fungsi anonim tersebut dapat mengakses variabel num yang berada di luar fungsi itu sendiri, konsep itu disebut JavaScript Closure. Nanti dibahas lebih lanjut pada artikel selanjutnya.

Itulah beberapa contoh penerapan higher-order function pada bahasa pemrograman JavaScript.