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:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30Pabrik fungsi
Pola paling umum: fungsi yang mengembalikan fungsi lain, "disesuaikan" dengan parameter yang diterimanya.
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.
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
Menerapkan `makeCounter()` pabrik yang mengembalikan fungsi: setiap pemanggilan fungsi mengembalikan bilangan bulat progresif yang dimulai dari 1. Penghitung yang berbeda harus independen.
Tunjukkan petunjuk
Deklarasikan n dengan let di dalam makeCounter, lalu kembalikan fungsi yang menghasilkan ++n.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Implementasikan `makeAdderWith(base)` yang mengembalikan fungsi: diberi nomor n, ia mengembalikan basis + n. Setiap penambah mengingat basisnya sendiri.
Tunjukkan petunjuk
mengembalikan fungsi panah yang menggunakan basis dari parameter luar.
Solusi tersedia setelah 3 upaya