Scope & Hoisting — JavaScript

Bayangin rumah kamu: di lobby, semua orang bisa ngakses (umum). Di kamar kamu, cuma kamu yang boleh masuk (privat). Di laci kamar, bahkan diri sendiri kadang…

Scope adalah wilayah kode tempat sebuah variabel bisa dipakai. Variabel yang dibuat di luar semua fungsi bisa dibaca dari mana saja, sedangkan yang dibuat di dalam fungsi atau di dalam { } cuma berlaku di situ. Hoisting adalah kebiasaan JavaScript mencatat semua deklarasi lebih dulu, sebelum baris pertama dijalankan.

🧪 Tebakan cepat: console.log(a) ditulis sebelum var a = 5. Hasilnya error atau bukan? Tebak dulu, jawabannya ada di bagian "Hoisting: deklarasi dicatat duluan".

Global dan fungsi: dari dalam boleh, dari luar gak

let kota = "Bandung";

function cetakKota() {
  let pesan = "Aku di ";
  return pesan + kota;
}

console.log(cetakKota()); // Aku di Bandung
console.log(pesan);       // ReferenceError: pesan is not defined

Aturannya satu arah: kode di dalam bisa melihat variabel di luarnya, tapi kode di luar gak bisa melihat ke dalam.

Block: let dan const berhenti di { }

let x = 1;
{
  let x = 2;
  console.log(x); // 2
}
console.log(x); // 1

var gak peduli block, dia cuma berhenti di batas fungsi. { var y = 1; } lalu console.log(y) tetap mencetak 1, karena y bocor keluar block. Ini salah satu alasan var dihindari.

Hoisting: deklarasi dicatat duluan

console.log(a); // undefined
var a = 5;

sapa(); // Halo!
function sapa() {
  console.log("Halo!");
}

console.log(b); // ReferenceError
let b = 10;

Closure: fungsi yang ingat variabelnya

Fungsi juga sebuah nilai, jadi fungsi bisa mengembalikan fungsi lain. Fungsi dalam itu tetap ingat variabel di scope tempat ia dibuat:

function buatTabungan() {
  let saldo = 0;
  return function () {
    saldo = saldo + 1000;
    return saldo;
  };
}

const nabung = buatTabungan();
console.log(nabung()); // 1000
console.log(nabung()); // 2000

⚠️ Jebakan yang sering ketemu

TL;DR: Scope menentukan di mana variabel bisa dipakai. Global bisa dibaca dari mana saja, variabel fungsi cuma di dalam fungsinya, dan let atau const cuma di dalam { }-nya. var bocor keluar block. Hoisting mencatat deklarasi lebih dulu: var bernilai undefined sebelum barisnya, let dan const melempar ReferenceError (TDZ), function declaration bisa dipanggil sebelum barisnya. Fungsi yang dikembalikan fungsi lain tetap ingat variabel luarnya (closure).

Yang akan kamu pelajari