1991 kata
10 menit

Function JavaScript: Membuat Kode Lebih Rapi dan Bisa Digunakan Ulang

Halo, Gabuters!

Pada artikel sebelumnya, kita sudah belajar perulangan JavaScript menggunakan for, while, dan do…while.

Dengan perulangan, kita tidak perlu menulis instruksi yang sama berkali-kali ketika ingin menjalankan suatu pekerjaan secara berulang.

Namun, sekarang bayangkan kita membuat website yang perlu menampilkan pesan sambutan di beberapa bagian program.

Kita mungkin menulis kode seperti ini:

console.log("Halo, Gabuters!");
console.log("Selamat datang di BapakGabut.");

Kemudian, ketika membutuhkan pesan yang sama di bagian lain, kita menyalin kedua baris tersebut.

Kalau hanya dua kali, mungkin belum terasa masalahnya.

Tetapi bagaimana jika kode yang sama digunakan di sepuluh tempat?

Ketika ingin mengubah pesannya, kita harus mencari dan memperbaiki semuanya.

Di sinilah function menjadi sangat berguna.

Dengan function, kita bisa mengelompokkan instruksi menjadi satu bagian kode yang dapat dipanggil kembali.

Pada artikel ini, kita akan belajar membuat function, memberikan input, mengembalikan hasil, dan memahami beberapa bentuk function dalam JavaScript.

1. Apa Itu Function?#

Function adalah blok kode yang dirancang untuk menjalankan tugas tertentu.

Kita dapat membuat function satu kali, kemudian memanggilnya ketika diperlukan.

Contohnya:

function tampilkanSalam() {
console.log("Halo, Gabuters!");
console.log("Selamat datang di BapakGabut.");
}

Kode tersebut membuat function bernama tampilkanSalam.

Namun, ketika kode itu dijalankan, pesan belum otomatis muncul.

Kenapa?

Karena kita baru mendefinisikan function, belum memanggilnya.

Untuk menjalankannya, gunakan:

tampilkanSalam();

Hasilnya:

Halo, Gabuters!
Selamat datang di BapakGabut.

Kita bisa memanggil function yang sama beberapa kali:

tampilkanSalam();
tampilkanSalam();

Hasilnya:

Halo, Gabuters!
Selamat datang di BapakGabut.
Halo, Gabuters!
Selamat datang di BapakGabut.

Jadi, kita tidak perlu menyalin isi function setiap kali ingin menjalankannya.

2. Struktur Dasar Function#

Mari perhatikan bentuk function declaration berikut:

function namaFunction() {
// Instruksi yang dijalankan
}

Ada beberapa bagian penting:

  • function merupakan kata kunci untuk mendeklarasikan function.
  • namaFunction adalah nama yang kita berikan.
  • () digunakan untuk menempatkan parameter jika diperlukan.
  • {} membungkus blok kode function.

Contohnya:

function tampilkanJudul() {
console.log("Belajar JavaScript");
}

Untuk menjalankannya:

tampilkanJudul();

Perhatikan perbedaan antara:

tampilkanJudul

Dan:

tampilkanJudul()

Penulisan pertama merujuk pada function tersebut tanpa langsung menjalankannya.

Sedangkan penulisan kedua memanggil function.

Perbedaan ini akan semakin penting ketika kita mulai menggunakan event pada browser.

3. Function dengan Parameter#

Function menjadi lebih berguna ketika dapat menerima input.

Bayangkan kita ingin menampilkan pesan sambutan untuk beberapa pengunjung.

Kalau tanpa parameter, kita mungkin membuat function berbeda untuk setiap nama.

function salamBudi() {
console.log("Halo, Budi!");
}
function salamAni() {
console.log("Halo, Ani!");
}

Cara tersebut tidak praktis.

Kita bisa membuat satu function yang menerima nama sebagai parameter.

function tampilkanSalam(nama) {
console.log(`Halo, ${nama}!`);
}

Kemudian memanggilnya:

tampilkanSalam("Budi");
tampilkanSalam("Ani");
tampilkanSalam("Gabuters");

Hasilnya:

Halo, Budi!
Halo, Ani!
Halo, Gabuters!

Pada contoh tersebut, nama adalah parameter.

Parameter merupakan nama variabel yang didefinisikan dalam deklarasi function untuk menerima input.

Sedangkan "Budi", "Ani", dan "Gabuters" adalah argument.

Argument merupakan nilai yang kita berikan ketika memanggil function.

Mudahnya:

  • Parameter disiapkan ketika function dibuat.
  • Argument diberikan ketika function dipanggil.

4. Function dengan Beberapa Parameter#

Sebuah function dapat memiliki lebih dari satu parameter.

Contohnya, kita ingin menghitung total artikel dari dua kategori.

function hitungTotalArtikel(html, css) {
const total = html + css;
console.log(`Total artikel: ${total}`);
}

Pemanggilannya:

hitungTotalArtikel(5, 6);

Hasilnya:

Total artikel: 11

Kita juga bisa menggunakan nilai yang berbeda:

hitungTotalArtikel(10, 8);

Hasilnya:

Total artikel: 18

Perhatikan urutan argument.

Ketika kita memanggil:

hitungTotalArtikel(5, 6);

Nilai 5 diberikan kepada parameter html, sedangkan 6 diberikan kepada css.

Karena itu, urutan argument perlu diperhatikan.

Parameter default#

JavaScript juga mendukung nilai default pada parameter.

Contohnya:

function tampilkanSalam(nama = "Gabuters") {
console.log(`Halo, ${nama}!`);
}

Sekarang kita bisa memanggil:

tampilkanSalam();
tampilkanSalam("Budi");

Hasilnya:

Halo, Gabuters!
Halo, Budi!

Ketika argument tidak diberikan atau bernilai undefined, nilai default digunakan.

Namun, jika kita memberikan null, nilai default tidak otomatis digunakan.

Contohnya:

tampilkanSalam(null);

Hasilnya:

Halo, null!

Ini berkaitan dengan perbedaan null dan undefined yang sudah kita pelajari pada artikel tipe data.

5. Mengenal return#

Sejauh ini, function kita langsung menampilkan hasil menggunakan console.log().

Tetapi bagaimana jika hasil perhitungannya ingin digunakan lagi?

Misalnya, kita ingin menghitung total artikel, kemudian menggunakan hasilnya untuk perhitungan lain.

Untuk itu, kita membutuhkan return.

Contohnya:

function hitungTotalArtikel(html, css) {
return html + css;
}

Sekarang kita bisa menyimpan hasil function ke dalam variabel.

const total = hitungTotalArtikel(5, 6);
console.log(total);

Hasilnya:

11

Perhatikan bahwa function tidak langsung mencetak hasil.

Function mengembalikan nilai kepada kode yang memanggilnya.

Nilai tersebut kemudian dapat digunakan untuk kebutuhan lain.

Contohnya:

function hitungTotalArtikel(html, css) {
return html + css;
}
const totalArtikel = hitungTotalArtikel(5, 6);
const targetArtikel = 20;
const sisaTarget = targetArtikel - totalArtikel;
console.log(`Total artikel: ${totalArtikel}`);
console.log(`Sisa target: ${sisaTarget}`);

Hasilnya:

Total artikel: 11
Sisa target: 9

Dengan return, function menjadi lebih fleksibel karena hasilnya tidak hanya digunakan untuk ditampilkan.

6. Perbedaan console.log dan return#

Ini salah satu hal yang sering membingungkan ketika pertama belajar function.

Perhatikan:

function tambah(a, b) {
console.log(a + b);
}

Kemudian:

const hasil = tambah(5, 3);
console.log(hasil);

Hasilnya:

8
undefined

Kenapa muncul undefined?

Karena function tambah() hanya menampilkan hasil menggunakan console.log().

Function tersebut tidak mengembalikan nilai secara eksplisit.

Dalam JavaScript, function yang selesai tanpa mengembalikan nilai akan menghasilkan undefined.

Sekarang bandingkan:

function tambah(a, b) {
return a + b;
}
const hasil = tambah(5, 3);
console.log(hasil);

Hasilnya:

8

Perbedaannya:

console.log()return
Menampilkan informasi di ConsoleMengembalikan nilai dari function
Cocok untuk melihat hasil atau debuggingCocok ketika hasil perlu digunakan kembali
Tidak otomatis menjadi nilai hasil functionMenentukan nilai yang diterima pemanggil

Sebuah function juga boleh menggunakan keduanya jika memang diperlukan.

Namun, untuk function yang tugas utamanya menghitung atau menghasilkan nilai, penggunaan return biasanya lebih fleksibel.

7. return Juga Menghentikan Eksekusi Function#

Selain mengembalikan nilai, return menghentikan eksekusi function saat itu.

Contohnya:

function periksaNilai(nilai) {
if (nilai < 0) {
return "Nilai tidak boleh negatif";
}
return "Nilai diterima";
}

Pemanggilannya:

console.log(periksaNilai(-5));
console.log(periksaNilai(80));

Hasilnya:

Nilai tidak boleh negatif
Nilai diterima

Ketika nilai kurang dari 0, function langsung mengembalikan pesan kesalahan.

Instruksi setelah return tidak dijalankan pada pemanggilan tersebut.

Pola seperti ini sering disebut early return.

Early return dapat membantu menyederhanakan function ketika kita perlu memeriksa kondisi yang membuat proses tidak bisa dilanjutkan.

8. Mengenal Scope Variabel#

Sekarang kita bahas konsep penting lainnya, yaitu scope.

Scope menentukan di bagian mana sebuah variabel dapat diakses.

Perhatikan contoh berikut:

function tampilkanArtikel() {
const judul = "Belajar JavaScript";
console.log(judul);
}
tampilkanArtikel();

Hasilnya:

Belajar JavaScript

Variabel judul dibuat di dalam function.

Sekarang coba mengaksesnya dari luar function:

console.log(judul);

Kode tersebut menghasilkan ReferenceError karena judul tidak tersedia di luar scope function.

Variabel di luar function#

Contoh berikut berbeda:

const namaWebsite = "BapakGabut";
function tampilkanWebsite() {
console.log(namaWebsite);
}
tampilkanWebsite();

Hasilnya:

BapakGabut

Function dapat membaca variabel yang tersedia dari scope luarnya sesuai aturan lexical scope JavaScript.

Namun, kita sebaiknya tidak membuat semua data sebagai variabel global.

Terlalu banyak ketergantungan pada variabel global dapat membuat kode lebih sulit diuji dan dipelihara.

Block scope dengan let dan const#

Variabel yang dibuat menggunakan let dan const juga mengikuti block scope.

Contohnya:

if (true) {
const status = "published";
console.log(status);
}

Kode di atas dapat menampilkan "published".

Tetapi jika kita mencoba mengakses status di luar blok if, akan muncul ReferenceError.

Karena itu, perhatikan di mana sebuah variabel dideklarasikan.

9. Function Declaration dan Function Expression#

Sampai sekarang, kita membuat function menggunakan bentuk berikut:

function tampilkanSalam() {
console.log("Halo, Gabuters!");
}

Bentuk ini disebut function declaration.

JavaScript juga mendukung function expression, yaitu function yang digunakan sebagai bagian dari sebuah ekspresi.

Contohnya:

const tampilkanSalam = function () {
console.log("Halo, Gabuters!");
};

Pemanggilannya tetap sama:

tampilkanSalam();

Hasilnya:

Halo, Gabuters!

Apa perbedaannya?#

Salah satu perbedaan penting berkaitan dengan hoisting.

Function declaration dapat dipanggil sebelum posisi deklarasinya dalam scope yang sama.

Contohnya:

tampilkanSalam();
function tampilkanSalam() {
console.log("Halo, Gabuters!");
}

Kode tersebut dapat dijalankan.

Sedangkan function expression yang disimpan dalam variabel const tidak dapat dipanggil sebelum deklarasi variabelnya selesai dieksekusi.

Contohnya:

tampilkanSalam();
const tampilkanSalam = function () {
console.log("Halo, Gabuters!");
};

Kode tersebut menghasilkan ReferenceError.

Untuk pemula, kita tidak perlu terlalu bergantung pada hoisting.

Menuliskan function sebelum digunakan sering membantu menjaga alur kode tetap mudah dibaca.

10. Mengenal Arrow Function#

JavaScript modern menyediakan cara lain untuk menulis function, yaitu arrow function.

Contohnya:

const tampilkanSalam = (nama) => {
console.log(`Halo, ${nama}!`);
};

Pemanggilannya:

tampilkanSalam("Gabuters");

Hasilnya:

Halo, Gabuters!

Sekilas, arrow function mirip dengan function expression.

Namun, cara penulisannya lebih ringkas.

Bandingkan:

const tambah = function (a, b) {
return a + b;
};

Dengan:

const tambah = (a, b) => {
return a + b;
};

Keduanya menghasilkan nilai yang sama ketika dipanggil dengan argument yang sama.

Arrow function dengan implicit return#

Jika arrow function hanya berisi satu ekspresi yang ingin dikembalikan, kita bisa menulisnya lebih singkat.

const tambah = (a, b) => a + b;
console.log(tambah(5, 3));

Hasilnya:

8

Pada bentuk tersebut, hasil ekspresi a + b dikembalikan secara otomatis.

Namun, jika menggunakan blok {}, kita tetap perlu menuliskan return ketika ingin mengembalikan nilai.

Contohnya:

const tambah = (a, b) => {
return a + b;
};

Apakah arrow function selalu lebih baik?#

Tidak selalu.

Arrow function memiliki perbedaan perilaku dibanding function biasa, terutama terkait this, arguments, dan penggunaannya sebagai constructor.

Karena itu, arrow function bukan sekadar function biasa dengan penulisan lebih pendek.

Untuk tahap awal, kita bisa menggunakan function declaration untuk function bernama yang jelas, dan mengenal arrow function sebagai bentuk yang sering ditemui pada JavaScript modern.

Nanti, ketika mempelajari array dan event, kita akan melihat penggunaan arrow function dalam konteks yang lebih nyata.

11. Function sebagai Nilai#

Ada satu karakteristik JavaScript yang menarik.

Function dapat disimpan dalam variabel dan diberikan sebagai argument kepada function lain.

Contohnya:

function tampilkanPesan() {
console.log("Halo, Gabuters!");
}
const jalankan = tampilkanPesan;
jalankan();

Hasilnya:

Halo, Gabuters!

Perhatikan bahwa kita menulis:

const jalankan = tampilkanPesan;

Bukan:

const jalankan = tampilkanPesan();

Penulisan pertama menyimpan referensi function ke dalam variabel jalankan.

Sedangkan penulisan kedua menjalankan function terlebih dahulu, lalu menyimpan nilai hasilnya.

Konsep function sebagai nilai akan sangat berguna ketika kita mempelajari callback, metode array, dan event.

12. Praktik: Membuat Function Pengelola Artikel#

Sekarang kita gabungkan materi function dengan variabel, percabangan, dan perulangan yang sudah dipelajari.

Bayangkan kita ingin membuat beberapa function sederhana untuk membantu mengelola informasi artikel BapakGabut.

Kita mulai dengan function untuk menghitung total artikel.

function hitungTotalArtikel(terbit, draft) {
return terbit + draft;
}

Kemudian kita buat function untuk menentukan status artikel.

function tentukanStatusArtikel(sudahTerbit) {
if (sudahTerbit) {
return "Published";
}
return "Draft";
}

Selanjutnya, buat function untuk menampilkan ringkasan.

function tampilkanRingkasan(terbit, draft) {
const total = hitungTotalArtikel(terbit, draft);
console.log("=== Ringkasan Artikel BapakGabut ===");
console.log(`Artikel terbit: ${terbit}`);
console.log(`Artikel draft: ${draft}`);
console.log(`Total artikel: ${total}`);
}

Sekarang gabungkan semuanya dalam satu file script.js:

function hitungTotalArtikel(terbit, draft) {
return terbit + draft;
}
function tentukanStatusArtikel(sudahTerbit) {
if (sudahTerbit) {
return "Published";
}
return "Draft";
}
function tampilkanRingkasan(terbit, draft) {
const total = hitungTotalArtikel(terbit, draft);
console.log("=== Ringkasan Artikel BapakGabut ===");
console.log(`Artikel terbit: ${terbit}`);
console.log(`Artikel draft: ${draft}`);
console.log(`Total artikel: ${total}`);
}
const jumlahTerbit = 8;
const jumlahDraft = 3;
tampilkanRingkasan(jumlahTerbit, jumlahDraft);
console.log(
`Status artikel baru: ${tentukanStatusArtikel(false)}`
);

Hasilnya:

=== Ringkasan Artikel BapakGabut ===
Artikel terbit: 8
Artikel draft: 3
Total artikel: 11
Status artikel baru: Draft

Dari contoh ini, kita mulai melihat manfaat memecah program menjadi beberapa function.

Setiap function memiliki tanggung jawab yang jelas.

hitungTotalArtikel() bertugas menghitung total.

tentukanStatusArtikel() menentukan label status.

tampilkanRingkasan() menyusun informasi yang ditampilkan.

Jika suatu saat aturan status berubah, kita bisa memperbaiki function yang berkaitan tanpa harus menulis ulang seluruh program.

Perlu diingat bahwa angka pada contoh tersebut hanya data latihan.

13. Kesalahan Umum Saat Menggunakan Function#

Membuat function tetapi lupa memanggilnya#

function tampilkanSalam() {
console.log("Halo!");
}

Kode tersebut hanya mendefinisikan function.

Agar pesannya muncul, kita harus memanggil:

tampilkanSalam();

Menganggap console.log sama dengan return#

function tambah(a, b) {
console.log(a + b);
}
const hasil = tambah(2, 3);

Nilai hasil adalah undefined, karena function tidak mengembalikan nilai secara eksplisit.

Jika hasilnya ingin digunakan kembali, gunakan return.

Lupa memberikan argument#

function tambah(a, b) {
return a + b;
}
console.log(tambah(5));

Hasilnya:

NaN

Kenapa?

Karena parameter b menerima nilai undefined ketika argument kedua tidak diberikan.

Operasi 5 + undefined menghasilkan NaN.

Untuk kebutuhan tertentu, kita bisa menggunakan parameter default atau memvalidasi input.

Salah memahami scope#

Variabel yang dibuat di dalam function tidak otomatis dapat digunakan di luar function.

function contoh() {
const pesan = "Halo!";
}
console.log(pesan);

Kode tersebut menghasilkan ReferenceError.

Function terlalu banyak melakukan pekerjaan#

Bayangkan sebuah function bertugas membaca input, memvalidasi data, menghitung total, mengubah HTML, dan mengirim data ke server sekaligus.

Function seperti itu bisa menjadi sulit dipahami dan diuji.

Jika memungkinkan, pisahkan pekerjaan menjadi beberapa function dengan tanggung jawab yang jelas.

Namun, jangan juga memecah setiap satu baris kode menjadi function tanpa alasan.

Tujuannya adalah membuat kode lebih mudah dibaca dan dipelihara.

14. Latihan Mandiri#

Sekarang giliran Gabuters mencoba.

Latihan 1: Function salam#

Buat function bernama sapaPengunjung() yang menerima parameter nama.

Function tersebut harus mengembalikan pesan:

Halo, Budi! Selamat datang di BapakGabut.

Gunakan return, kemudian tampilkan hasilnya melalui console.log().

Latihan 2: Menghitung total artikel#

Buat function bernama hitungTotal() dengan tiga parameter:

  • Jumlah artikel HTML.
  • Jumlah artikel CSS.
  • Jumlah artikel JavaScript.

Function harus mengembalikan total seluruh artikel.

Latihan 3: Menentukan kategori nilai#

Buat function kategoriNilai(nilai).

Aturannya:

  • Nilai 90 ke atas: "Sangat Baik".
  • Nilai 75 sampai 89: "Baik".
  • Nilai 60 sampai 74: "Cukup".
  • Nilai di bawah 60: "Perlu Belajar Lagi".

Gunakan if, else if, dan return.

Latihan 4: Menggunakan arrow function#

Ubah function berikut menjadi arrow function:

function kali(a, b) {
return a * b;
}

Kemudian panggil dengan argument 4 dan 5.

Tantangan tambahan#

Buat function tampilkanNomorArtikel(jumlah).

Function tersebut menerima jumlah artikel, kemudian menggunakan perulangan for untuk menampilkan:

Artikel #1
Artikel #2
Artikel #3

Jika dipanggil dengan:

tampilkanNomorArtikel(3);

Coba juga panggil menggunakan nilai 5 dan lihat hasilnya.

15. Penutup#

Pada artikel ini, kita sudah belajar membuat dan menggunakan function dalam JavaScript.

Kita memahami perbedaan parameter dan argument, menggunakan return untuk mengembalikan nilai, serta mengenal scope variabel.

Kita juga mempelajari function declaration, function expression, dan arrow function.

Yang paling penting, kita mulai memahami bahwa function membantu mengorganisasi kode menjadi bagian-bagian yang dapat digunakan kembali.

Namun, sejauh ini contoh kita masih banyak menggunakan variabel terpisah.

Bagaimana jika kita mempunyai puluhan artikel dengan judul, kategori, dan status masing-masing?

Apakah kita harus membuat variabel berbeda untuk setiap artikel?

Tentu ada cara yang lebih praktis.

Pada artikel berikutnya, kita akan membahas Array dan Object JavaScript: Mengelola Sekumpulan Data.

Kita akan belajar menyimpan kumpulan data, mengaksesnya, dan mengolahnya menggunakan metode seperti forEach(), map(), dan filter().

Sampai jumpa di artikel berikutnya, Gabuters!

JavaScript

Selesai

Bagian 5 dari 8Tulisan ini bagian dari seri

Bagikan Artikel

Buat poster berbagi atau salin tautan artikel ini.

Lanjut membaca

Bacaan terkait

Berdasarkan tag dan kategori yang sama

Coba jalur lain

Pilihan konsisten dari artikel lain