Lompati ke konten utama
Modul 4 · Pelajaran 4 dari 416/32 dalam kursus~12 min
Pelajaran modul (4/4)

Penutupan dan ruang lingkup

Penutupan adalah fungsi yang "mengingat" variabel dalam cakupan yang didefinisikan, bahkan setelah cakupan itu berakhir. Kelihatannya seperti sihir tapi itu adalah konsekuensi langsung dari aturan ruang lingkup.

Rantai lingkup

Suatu fungsi dapat membaca variabel yang dideklarasikan di luar dirinya, berjalan di rantai cakupan:

JS
const moltiplicatore = 10;

function moltiplicaPer10(n) {
  return n * moltiplicatore; // reads from the closure
}

moltiplicaPer10(3); // 30

Pabrik fungsi

Pola paling umum: fungsi yang mengembalikan fungsi lain, "disesuaikan" dengan parameter yang diterimanya.

JS
function creaSaluto(prefisso) {
  return function (nome) {
    return `${prefisso}, ${nome}!`;
  };
}

const ciao = creaSaluto('Ciao');
const buongiorno = creaSaluto('Buongiorno');

ciao('Anna'); // 'Ciao, Anna!'
buongiorno('Marco'); // 'Buongiorno, Marco!'

Setiap panggilan ke creaSaluto menciptakan cakupan terpisah, dengan prefisso sendiri.

Kontra dengan negara swasta

Contoh klasiknya: penutupan yang menjaga penghitung tanpa memaparkannya ke luar.

JS
function creaContatore() {
  let n = 0;
  return function () {
    n++;
    return n;
  };
}

const c = creaContatore();
c(); // 1
c(); // 2
c(); // 3

const c2 = creaContatore();
c2(); // 1  ← isolated state!

n bersifat pribadi: tidak ada orang di luar penutupan yang dapat membaca atau memodifikasinya.

Cobalah

Latihan#js.m4.l4.e1
Upaya: 0Memuat…

Menerapkan `makeCounter()` pabrik yang mengembalikan fungsi: setiap pemanggilan fungsi mengembalikan bilangan bulat progresif yang dimulai dari 1. Penghitung yang berbeda harus independen.

Memuat editor…
Tunjukkan petunjuk

Deklarasikan n dengan let di dalam makeCounter, lalu kembalikan fungsi yang menghasilkan ++n.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#js.m4.l4.e2
Upaya: 0Memuat…

Implementasikan `makeAdderWith(base)` yang mengembalikan fungsi: diberi nomor n, ia mengembalikan basis + n. Setiap penambah mengingat basisnya sendiri.

Memuat editor…
Tunjukkan petunjuk

mengembalikan fungsi panah yang menggunakan basis dari parameter luar.

Solusi tersedia setelah 3 upaya