Ok fonksiyonlarının tekrardan üzerinden geçelim.
Ok fonksiyonları sadece basit Åeylerin kolayca yazılması için kullanılmaz.
JavaScriptâte bir sürü baÅka yerde çalıÅtırılması gereken kolayca yazılacak fonksiyonlara ihtiyacımız olabilir,
ÃrneÄin:
arr.forEach(func)â her birforEachdöngüsündefuncçalıÅtırılır.setTimeout(func)â Varolan planlayıcı tarafındafuncçalıÅtırılır.- ⦠vs.
Bir fonksiyon yaratıp bunu baÅka bir yerlere iletmek JavaScriptâin ruhuna tam da uyan bir iÅlemdir. Böyle fonksiyonlarda var olan kaynaÄın ( context) kaybolması istenmez.
Ok fonksiyonlarının âthisâ'i yoktur.
Daha önceki bölümden de Objelerin metodları ve "this" kelimesi. hatırlayacaÄınız üzere, ok fonksiyonlarının thisâi olmaz. EÄer this eriÅilmiÅ ise bu dıÅarıdaki thisâdir.
ÃrneÄin bunu objenin içerisinde dönme amaçlı kullanabiliriz:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
Buradaki forEachâte ok fonksiyonu kullanılmıÅtır, ve this.title tam olarak dıÅarıdaki showList metodu ile aynı içeriÄe sahiptir. Yani group.titleâdır.
EÄer bunu ânormalâ bir fonksiyon ile yazsaydık, hata alırdık:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(function(student) {
// Hata: 'title' özelliÄi tanımsız.
alert(this.title + ': ' + student)
});
}
};
group.showList();
Hatanın sebebi forEach çalıÅırken this=undefined varsayılan olarak çalıÅır, bundan dolayı undefined.title çaÄrısı yapılır.
Bu ok fonksiyonlarında iÅlemez çünkü ok fonksiyonlarında this bulunmamaktadır.
new ile çalıÅtırılamazlar.thisâin olmaması bazı sınırlamalara neden olur: ok fonksiyonları constructors(yapıcı â kurucu ) olamazlar ve new ile çaÄırılamazlar.
=> fonksiyonları ile .bind(this) ile çaÄırılan normal fonksiyonlar arasında ince bir fark vardır.
.bind(this)fonksiyonun âbaÄlı versiyonuâ'nu oluÅtururken.=>fonksiyonu hiçbir baÄlılık oluÅturmaz. Fonksiyon basit bir Åekildethisâe sahip deÄildir.thisâin aranması aynı normal fonksiyonlardaki gibi dıÅarıdaki sözcüksel ortamda aranması ile son bulur.
Ok fonksiyonlarının âargümanlarıâ olmaz.
Ok fonksiyonlarının argüman deÄiÅkenleri olmaz.
Var olan this ve argümanlar ile çaÄrıyı yönelendirmek istediÄimizde ( dekoratör ) çok yararlı olur.
ÃrneÄin defer(f, ms) fonksiyonu bir fonksiyon alıyor ve çaÄrıyı ms kadar geciktiren bir saklayıcı ile dönderiyor:
function defer(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms)
};
}
function sayHi(who) {
alert('Hello, ' + who);
}
let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("John"); // Hello, John 2 sn sonra.
Aynısı ok fonksiyonu olmadan aÅaÄıdaki gibi görünür:
function defer(f, ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
Burada ayrıca args ve ctx deÄiÅkenlerinin yaratılması gerekir. Böylece setTimeout içerisindeki fonksiyon bunları alabilir.
Ãzet
Ok fonksiyonları:
thisyok.argümanyoknewile çaÄırılamaz.superyok. Bunu henüz iÅlemedik, ilerleyen Sınıf kalıtımı, super bölümünde inceleyeceÄiz.
Bunların nedeni kısa ve kendi âkaynaÄıâ olmayan ve dıŠkaynaÄı kullanacak fonksiyonlar yaratılmak istenmesindendir. Bu noktada gerçekten beklendiÄi gibi bir etki yapmatadır.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)