← Kembali ke kursus
Pelajaran kursus · JavaScript
Pelajaran 10

Scope dan closure

Lexical scope, closure, IIFE — fondasi JavaScript.

Pahami konsepnya

Scope adalah jangkauan variabel. JavaScript punya three scope: global, function, dan block (since ES6 — let/const di dalam {} adalah block-scoped). var TIDAK block-scoped — ia bocor keluar dari if/for ke seluruh function. Ini alasan utama menghindari var.

Closure adalah fungsi yang "mengingat" variabel dari scope pembuatnya meski scope itu sudah selesai. function buatPenghitung() { let hitung = 0; return () => ++hitung; } — fungsi yang dikembalikan menutup (close over) variabel hitung. Ini cara JavaScript membuat private variable, counter, dan currying.

IIFE (Immediately Invoked Function Expression): (function() { ... })() — pola lama untuk membuat scope terisolasi sebelum ada module. Masih berguna untuk menghindari polusi global scope di kode legacy.

Coba contoh kode

// closure: penghitung
function buatPenghitung() {
  let hitung = 0;  // private — tertutup dalam closure
  return {
    naik: () => ++hitung,
    turun: () => --hitung,
    nilai: () => hitung,
  };
}

const c = buatPenghitung();
c.naik(); c.naik(); c.naik();
console.log(c.nilai());  // 3
console.log(c.hitung);    // undefined — private!

// block scope
if (true) {
  let dalam = "hanya di sini";
  var bocor = "keluar dari if";
}
console.log(bocor);       // "keluar dari if"
// console.log(dalam);    // ReferenceError

hitung tidak bisa diakses dari luar — hanya method naik/turun/nilai yang menutupnya. Ini pola module pattern berbasis closure. var bocor keluar dari if karena function-scoped, let dalam terkunci karena block-scoped.

Latihan singkat

Uji: closure counter mulai 10 — c.naik() harus `11`.