Modül dersleri (4/4)
Kapanışlar ve kapsam
kapama, tanımlandığı kapsamın değişkenlerini "hatırlayan" bir işlevdir, bu kapsam sona erdikten sonra bile. Sihir gibi görünüyor ancak kapsam kurallarının doğrudan bir sonucudur.
Kapsam zinciri
Bir işlev, kendi dışında bildirilen değişkenleri okuyabilir ve kapsam zincirinde yukarı doğru yürüyebilir:
const moltiplicatore = 10;
function moltiplicaPer10(n) {
return n * moltiplicatore; // reads from the closure
}
moltiplicaPer10(3); // 30Fonksiyon fabrikası
En tipik kalıp: "özelleştirilmiş" başka bir işlevi döndüren bir işlev aldığı parametreler.
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!'creaSaluto'a yapılan her çağrı, kendi prefisso'si olan ayrı bir kapsam oluşturur.
Özel devletli sayaç
Klasik örnek: Bir tezgahı dışarıya maruz bırakmadan tutan bir kapak.
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 özeldir: kapatma dışında hiç kimse onu okuyamaz veya değiştiremez.
Deneyin
Bir işlev döndüren bir fabrika `makeCounter()` uygulayın: işlevin her çağrısı, 1'den başlayarak artan bir tamsayı döndürür. Farklı sayaçlar bağımsız olmalıdır.
İpucu göster
MakeCounter'da let ile n'yi bildirin, ardından ++n işlevini yapan bir işlev döndürün.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
Bir işlevi döndüren 'makeAdderWith(base)'i uygulayın: n sayısı verildiğinde, base + n değerini döndürür. Her toplayıcı kendi tabanını hatırlar.
İpucu göster
dış parametreden tabanı kullanan bir ok işlevi döndürür.
3 denemeden sonra çözüm mevcut