Learn
← Previous Next →

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