Ok fonksiyonlarnn tekrardan zerinden geelim.
Ok fonksiyonlar sadece basit eylerin kolayca yazlmas iin kullanlmaz.
JavaScriptte bir sr baka yerde altrlmas gereken kolayca yazlacak fonksiyonlara ihtiyacmz olabilir,
rnein:
arr.forEach(func)her birforEachdngsndefuncaltrlr.setTimeout(func)Varolan planlayc tarafndafuncaltrlr.- vs.
Bir fonksiyon yaratp bunu baka bir yerlere iletmek JavaScriptin ruhuna tam da uyan bir ilemdir. Byle fonksiyonlarda var olan kaynan ( context) kaybolmas istenmez.
Ok fonksiyonlarnn this'i yoktur.
Daha nceki blmden de Objelerin metodlar ve "this" kelimesi. hatrlayacanz zere, ok fonksiyonlarnn thisi olmaz. Eer this eriilmi ise bu dardaki thisdir.
rnein bunu objenin ierisinde dnme amal kullanabiliriz:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
Buradaki forEachte ok fonksiyonu kullanlmtr, ve this.title tam olarak dardaki showList metodu ile ayn ierie sahiptir. Yani group.titledr.
Eer bunu normal bir fonksiyon ile yazsaydk, hata alrdk:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(function(student) {
// Hata: 'title' zellii tanmsz.
alert(this.title + ': ' + student)
});
}
};
group.showList();
Hatann sebebi forEach alrken this=undefined varsaylan olarak alr, bundan dolay undefined.title ars yaplr.
Bu ok fonksiyonlarnda ilemez nk ok fonksiyonlarnda this bulunmamaktadr.
new ile altrlamazlar.thisin olmamas baz snrlamalara neden olur: ok fonksiyonlar constructors(yapc kurucu ) olamazlar ve new ile arlamazlar.
=> fonksiyonlar ile .bind(this) ile arlan normal fonksiyonlar arasnda ince bir fark vardr.
.bind(this)fonksiyonun bal versiyonu'nu olutururken.=>fonksiyonu hibir ballk oluturmaz. Fonksiyon basit bir ekildethise sahip deildir.thisin aranmas ayn normal fonksiyonlardaki gibi dardaki szcksel ortamda aranmas ile son bulur.
Ok fonksiyonlarnn argmanlar olmaz.
Ok fonksiyonlarnn argman deikenleri olmaz.
Var olan this ve argmanlar ile ary ynelendirmek istediimizde ( dekoratr ) ok yararl olur.
rnein defer(f, ms) fonksiyonu bir fonksiyon alyor ve ary ms kadar geciktiren bir saklayc ile dnderiyor:
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.
Ayns ok fonksiyonu olmadan aadaki gibi grnr:
function defer(f, ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
Burada ayrca args ve ctx deikenlerinin yaratlmas gerekir. Bylece setTimeout ierisindeki fonksiyon bunlar alabilir.
zet
Ok fonksiyonlar:
thisyok.argmanyoknewile arlamaz.superyok. Bunu henz ilemedik, ilerleyen Snf kaltm, super blmnde inceleyeceiz.
Bunlarn nedeni ksa ve kendi kayna olmayan ve d kayna kullanacak fonksiyonlar yaratlmak istenmesindendir. Bu noktada gerekten beklendii gibi bir etki yapmatadr.
Yorumlar
<code>kullannz, birka satr eklemek iin ise<pre>kullann. Eer 10 satrdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)