- Bab 4 dari 12
- 30 menit
- 1 latihan kode
- 4 soal kuis
Fungsi, Scope, dan Hoisting
Di bab ini (10 bagian)
Tujuan bab ini
- Membedakan function declaration dan function expression, termasuk kapan masing-masing bisa dipanggil.
- Memakai parameter, argumen, dan
returndengan benar. - Memahami callback sederhana dan closure dasar.
- Mengenali scope global, fungsi, dan blok, serta efek hoisting pada
vardan function declaration.
Kenapa butuh fungsi?
Bayangkan kamu harus menghitung total belanja dengan diskon di sepuluh tempat berbeda dalam satu program. Kalau rumusnya ditulis ulang sepuluh kali, satu salah ketik saja bikin hasilnya beda-beda. Fungsi menyelesaikan masalah ini: kamu menulis logikanya sekali, memberinya nama, lalu memanggilnya kapan pun dibutuhkan. Kalau rumusnya berubah, kamu cukup mengubah satu tempat.
Anggap fungsi seperti resep. Resep punya bahan (parameter), langkah (isi fungsi), dan hasil jadi (nilai return). Resep yang sama bisa dipakai berkali-kali dengan bahan berbeda.
Function declaration vs function expression
Ada dua cara utama membuat fungsi di JavaScript.
Sejak ES2015 (ES6) ada juga arrow function, bentuk ringkas dari function expression:
Perbedaan paling terasa antara declaration dan expression ada di kapan fungsi itu bisa dipanggil. Function declaration bisa dipanggil bahkan sebelum barisnya ditulis, sedangkan function expression baru bisa dipakai setelah baris penugasannya dijalankan. Kenapa begitu? Jawabannya ada di bagian hoisting nanti.
| Declaration | Expression / arrow | |
|---|---|---|
| Bentuk | function nama() {} | const nama = function () {} |
| Dipanggil sebelum didefinisikan | Bisa | Tidak (error) |
| Cocok untuk | Fungsi utama, helper umum | Callback, fungsi yang dikirim ke fungsi lain |
Parameter, argumen, dan return
Parameter adalah nama variabel di definisi fungsi. Argumen adalah nilai nyata yang kamu kirim saat memanggilnya. Di tambah(2, 3), parameternya a dan b, argumennya 2 dan 3.
JavaScript cukup santai soal jumlah argumen. Argumen yang tidak dikirim bernilai undefined, dan kamu bisa memberi nilai default (ES2015):
return melakukan dua hal: mengirim nilai keluar dari fungsi dan menghentikan fungsi saat itu juga. Baris setelah return tidak akan dijalankan. Fungsi tanpa return tetap menghasilkan nilai, yaitu undefined.
Ingat bedanya: console.log menampilkan sesuatu ke layar, sedangkan return mengembalikan nilai supaya bisa dipakai kode lain.
Callback sederhana
Di JavaScript, fungsi adalah nilai biasa. Ia bisa disimpan di variabel dan dikirim sebagai argumen ke fungsi lain. Fungsi yang dikirim itu disebut callback, karena akan "dipanggil balik" oleh fungsi penerimanya.
Perhatikan: kita menulis gandakan, bukan gandakan(). Tanpa kurung berarti "kirim fungsinya", dengan kurung berarti "panggil sekarang dan kirim hasilnya". Pola callback ini akan sering kamu temui di method array seperti map dan filter, juga di addEventListener untuk DOM.
Scope: siapa boleh melihat variabel?
Scope adalah area tempat sebuah variabel bisa diakses. Ada tiga jenis yang perlu kamu kenal dulu:
- Global scope: variabel di luar semua fungsi dan blok, bisa diakses di mana saja.
- Function scope: variabel di dalam fungsi hanya hidup di fungsi itu.
- Block scope:
letdanconstdi dalam{ }(misalnyaifataufor) hanya hidup di blok itu.
Aturannya satu arah: kode di dalam bisa melihat variabel di luar, tapi kode di luar tidak bisa mengintip ke dalam. Seperti kaca film mobil, dari dalam kamu bisa melihat jalan, dari luar orang tidak bisa melihat ke dalam. var hanya menghormati batas fungsi, bukan batas blok, itulah salah satu alasan kita lebih memilih let dan const.
Closure dasar
Closure terjadi ketika sebuah fungsi mengingat variabel dari scope tempat ia dibuat, bahkan setelah fungsi luarnya selesai berjalan.
Langkah demi langkah: buatPenghitung() membuat variabel hitung, lalu mengembalikan fungsi dalam. Normalnya hitung hilang setelah fungsi selesai, tapi karena fungsi dalam masih memakainya, JavaScript menyimpannya. Setiap pemanggilan buatPenghitung() membuat hitung baru, jadi klik dan klikLain tidak saling ganggu. Closure berguna untuk menyimpan data "privat" yang tidak bisa diubah langsung dari luar.
Hoisting dasar
Sebelum menjalankan kode, JavaScript membaca dulu semua deklarasi di sebuah scope. Efeknya seolah deklarasi "diangkat" ke atas, makanya disebut hoisting.
- Function declaration terangkat lengkap dengan isinya, jadi bisa dipanggil lebih awal.
varterangkat namanya saja dan diisiundefinedsampai baris penugasan.letdanconstjuga dikenali lebih awal, tapi berada di temporal dead zone sampai barisnya dijalankan, sehingga mengaksesnya lebih dulu memicuReferenceError.
Karena function expression disimpan di const atau let, ia ikut aturan yang ketiga. Itu sebabnya kurang() tidak bisa dipanggil sebelum didefinisikan.
Kesalahan umum
- Lupa
return. Fungsi menghitung dengan benar tapi hasilnyaundefinedkarena hanyaconsole.log, bukanreturn. - Memanggil callback terlalu cepat. Menulis
prosesNilai(5, gandakan())mengirim hasil panggilan, bukan fungsinya. - Arrow function dengan kurung kurawal tanpa
return.x => { x * 2 }menghasilkanundefined; tulisx => x * 2atau tambahkanreturn. - Mengandalkan
vardi dalam blok. Variabel "bocor" ke luarifataufordan bisa menimpa variabel lain. - Mengandalkan hoisting. Kode yang memakai variabel sebelum dideklarasikan sulit dibaca; biasakan deklarasi di atas.
Rangkuman
- Function declaration terangkat utuh, function expression dan arrow function baru bisa dipakai setelah didefinisikan.
- Parameter ada di definisi, argumen dikirim saat memanggil;
returnmengirim nilai dan menghentikan fungsi. - Callback adalah fungsi yang dikirim sebagai argumen untuk dipanggil oleh fungsi lain.
let/constberscope blok,varberscope fungsi; dari dalam bisa melihat ke luar, tidak sebaliknya.- Closure membuat fungsi mengingat variabel dari tempat ia dibuat.
Slide 9 sampai 10 dari deck JavaScript. Penjelasan lengkapnya ada di mode Baca.

Selesaikan bab ini
- 1. Baca materi
- 2. Latihan kode (1)
- 3. Kuis (4 soal)
Latihan kode: Diskon, tabungan, dan callback
Lengkapi tiga fungsi berikut.
hitungTotal(harga, diskon)mengembalikan harga setelah diskon dalam persen. Kalaudiskontidak dikirim, anggap0. Contoh:hitungTotal(100000, 10)menghasilkan90000.buatTabungan(awal)mengembalikan fungsisetor(jumlah). Setiap kalisetordipanggil, saldo bertambah dan saldo terbaru di-return. Setiap tabungan punya saldo sendiri (closure).prosesDua(a, b, aksi)memanggil callbackaksidenganadanb, lalu mengembalikan hasilnya. Contoh:prosesDua(6, 7, (x, y) => x * y)menghasilkan42.
Cek pemahaman
1Bentuk fungsi mana yang bisa dipanggil sebelum barisnya ditulis?
2Apa yang ditampilkan kode berikut?
function buatPenghitung() { let n = 0; return () => ++n; } const a = buatPenghitung(); const b = buatPenghitung(); a(); a(); console.log(a() + b());3Fungsi tanpa pernyataan return menghasilkan nilai null.
4Apa yang ditampilkan kode berikut?
console.log(x); var x = 7;
