Hari 7: Scope, Closure & Hoisting
60 min
Last updated 09 Apr 2026
Scope di JavaScript
const global = "saya global";
function luaran() {
const lokal = "saya lokal";
console.log(global); // bisa akses global
function dalam() {
const dalamVar = "dalam";
console.log(lokal); // bisa akses scope luar
console.log(global); // bisa akses global
}
dalam();
// console.log(dalamVar); // Error! tidak bisa akses scope dalam
}
luaran();
Closure — Fungsi yang Mengingat
function buatCounter(awal = 0) {
let count = awal; // variabel yang "diingat"
return {
tambah: () => ++count,
kurang: () => --count,
reset: () => { count = awal; },
nilai: () => count,
};
}
const counter = buatCounter(10);
counter.tambah(); // 11
counter.tambah(); // 12
counter.kurang(); // 11
console.log(counter.nilai()); // 11
Hoisting
// Function declaration — hoisted penuh
sapa("Budi"); // OK, bisa dipanggil sebelum deklarasi
function sapa(nama) { console.log(`Halo, ${nama}`); }
// let/const — NOT hoisted (temporal dead zone)
// console.log(x); // ReferenceError!
let x = 5;
// var — hoisted tapi undefined
console.log(y); // undefined (bukan error)
var y = 10;
💡
Notice: Closure memungkinkan variabel `saldo` tetap "hidup" dan bisa diakses oleh method yang dikembalikan.
Assignment
Buat fungsi buatSaldo(saldoAwal) yang return objek dengan method setor(jumlah), tarik(jumlah), dan cekSaldo(). tarik() harus return false jika saldo tidak cukup. Test dengan saldo 1000000.
Expected output:
Tarik berhasil: true
Saldo: Rp 1,300,000
JS
script.js
Solution
Output