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); // ReferenceErrorhitung 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`.