Episode ini membahas cara membungkus logika menjadi fungsi yang bisa dipanggil ulang: function declaration, parameter, dan return. Kalian juga memahami scope variabel global, function, dan block, plus perilaku hoisting yang sering membingungkan pemula.

Kode yang ditulis berjajar dari atas ke bawah akan cepat menjadi berantakan begitu program tumbuh. Fungsi adalah jawaban JavaScript untuk masalah ini: sebuah blok logika bernama yang bisa dipanggil kapan pun dibutuhkan, sehingga kalian tidak menulis ulang kode yang sama berkali-kali.
Episode 4 membahas dua hal yang saling berkaitan. Pertama, fungsi itu sendiri: cara mendeklarasikannya, cara mengirim data lewat parameter, dan cara menerima hasil lewat return. Kedua, scope: aturan ke mana saja sebuah variabel bisa diakses, yang menentukan apakah variabel itu aman dipakai di dalam atau di luar fungsi.
Scope dan fungsi adalah pasangan yang tidak bisa dipisahkan. Begitu kalian memahami keduanya, kode kalian akan lebih terstruktur dan lebih mudah dicari kesalahannya.
Cara paling dasar mendefinisikan fungsi adalah dengan kata kunci function:
function sapa(nama) {
return `Halo, ${nama}!`;
}
console.log(sapa("Arman"));function sapa(nama) mendeklarasikan fungsi bernama sapa yang menerima satu parameter nama dan mengembalikan string. Memanggilnya dengan sapa("Arman") menghasilkan Halo, Arman!. Kata kunci return menentukan nilai yang dikembalikan; tanpa return, fungsi mengembalikan undefined.
Fungsi idealnya melakukan satu pekerjaan dengan jelas. Fungsi yang mencampur banyak tanggung jawab sulit diuji dan sulit dipakai ulang. Contoh sederhana yang benar:
function hitungLuasPersegi(sisi) {
return sisi * sisi;
}
function hitungLuasSegitiga(alas, tinggi) {
return (alas * tinggi) / 2;
}
console.log(hitungLuasPersegi(5));
console.log(hitungLuasSegitiga(6, 4));hitungLuasPersegi(5) mengembalikan 25, dan hitungLuasSegitiga(6, 4) mengembalikan 12. Setiap fungsi punya satu tanggung jawab yang jelas, dan keduanya bisa dipanggil kapan saja. Ini pola yang akan kalian pertahankan di seluruh series.
Fungsi bisa menerima banyak parameter, dan pemanggil bertanggung jawab mengirim nilainya dengan urutan yang sama:
function hitungDiskon(harga, persen) {
return harga - (harga * persen) / 100;
}
console.log(hitungDiskon(200000, 25));hitungDiskon(200000, 25) mengembalikan 150000 — harga 200000 dikurangi diskon 25 persen. Parameter berperilaku seperti variabel lokal di dalam fungsi: nilainya berasal dari pemanggil, dan perubahan di dalamnya tidak bocor keluar.
Setiap pernyataan return langsung menghentikan eksekusi fungsi. Kode setelah return tidak pernah dijalankan:
function klasifikasiNilai(nilai) {
if (nilai >= 75) {
return "Lulus";
}
return "Belum lulus";
}
console.log(klasifikasiNilai(80));
console.log(klasifikasiNilai(60));return "Lulus" mengembalikan hasil dan mengakhiri fungsi; baris berikutnya hanya berjalan jika kondisi pertama salah. Pola early return seperti ini membuat fungsi lebih mudah dibaca daripada deretan else.
Scope menentukan di mana sebuah variabel bisa diakses. JavaScript punya tiga tingkatan utama:
let dan const di dalam {}, hanya berlaku di dalam blok tersebut.const global = "bisa diakses di mana saja";
if (true) {
const lokal = "hanya di dalam blok";
console.log(global);
console.log(lokal);
}
console.log(global);const lokal dideklarasikan di dalam blok if dan tidak bisa diakses di luar blok itu — mencobanya akan memicu ReferenceError. Ini yang membedakan let dan const dari var yang tidak menghormati block scope.
Variabel yang dideklarasikan di dalam fungsi juga tersembunyi dari luar:
function proses() {
const rahasia = "tidak terlihat dari luar";
return rahasia;
}
console.log(proses());const rahasia hanya hidup selama fungsi dieksekusi dan tidak bisa diakses dari scope luar. Mencoba memanggil rahasia di luar fungsi akan error. Dengan menyembunyikan variabel internal, fungsi tidak saling mengganggu satu sama lain.
Selain declaration, fungsi bisa disimpan dalam variabel — ini disebut function expression:
const kaliDua = function (angka) {
return angka * 2;
};
console.log(kaliDua(7));const kaliDua = function (angka) menyimpan fungsi anonim ke dalam variabel. Fungsi ini baru bisa dipanggil setelah deklarasi, karena variabelnya tidak di-hoist. Perbedaan ini kecil tapi penting untuk dipahami.
Hoisting adalah perilaku JavaScript yang "mengangkat" deklarasi function ke atas scope-nya, sehingga function declaration bisa dipanggil sebelum barisnya ditulis:
console.log(jumlahkan(3, 4));
function jumlahkan(a, b) {
return a + b;
}Kode di atas berjalan tanpa error karena function jumlahkan di-hoist seluruhnya. Sebaliknya, function expression yang disimpan di const tidak di-hoist dan akan memicu ReferenceError jika dipanggil terlalu dini.
Warning
Bedakan tiga error yang sering muncul: ReferenceError berarti variabel tidak pernah dideklarasikan di scope itu, TypeError berarti variabel ada tapi bukan fungsi atau objek yang kalian kira, dan SyntaxError berarti kode ditulis dengan sintaks yang salah. Membaca nama error adalah keterampilan debugging pertama.
Episode 4 membuat kalian bisa mengorganisasi kode dengan fungsi: mendeklarasikannya, mengirim data lewat parameter, menerima hasil lewat return, memahami scope global, function, dan block, serta membedakan function declaration yang di-hoist dan function expression yang tidak.
Inti yang harus dibawa pulang:
return menentukan hasil fungsi dan menghentikan eksekusi.let dan const menghormati block scope; var tidak.Di episode 5 selanjutnya kita akan membahas array, objek, dan struktur data dasar — menyimpan kumpulan nilai dengan array, memodelkan entitas dengan objek, membangun data bertingkat, dan mengenal Set serta Map sebagai struktur data tambahan. Ini fondasi yang akan dipakai setiap episode berikutnya.