tl; dr: Hayır! Ok işlevleri ve işlev bildirimleri / ifadeleri eşdeğer değildir ve körü körüne değiştirilemez.
Eğer yok değiştirmek istediğiniz işlevi ise değil kullanmak this
, arguments
ve ile çağrılmaz new
, o zaman evet.
Sık sık olduğu gibi: duruma göre değişir . Ok işlevleri, işlev bildirimleri / ifadelerinden farklı davranışlara sahiptir, bu yüzden önce farklılıklara bir göz atalım:
1. Sözcüksel this
vearguments
Ok işlevlerinin kendilerine ait this
veya arguments
bağları yoktur. Bunun yerine, bu tanımlayıcılar diğer değişkenler gibi sözcüksel kapsamda çözümlenir. Bu demektir ki, bir ok işlevi içinde, bu this
ve arguments
değerlerine bakın this
ve arguments
ok fonksiyonu olan bir ortamda tanımlanan (yani, "dış" ok fonksiyonu) 'de:
// Example using a function expression
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: function() {
console.log('Inside `bar`:', this.foo);
},
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
// Example using a arrow function
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
İşlev ifadesi durumunda, this
içinde oluşturulan nesneyi ifade eder createObject
. Ok fonksiyonu durumunda, this
anlamına gelir this
ve createObject
kendi başına.
Bu this
, geçerli ortama erişmeniz gerektiğinde ok işlevlerini kullanışlı hale getirir :
// currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
Bunun, bir ok işlevinin veya ile ayarlanmasının mümkün olmadığı anlamına geldiğini de unutmayın .this
.bind
.call
Çok aşina değilseniz this
okumayı düşünün
2. Ok fonksiyonları ile çağrılamaz new
Olan işlevler arasında ES2015 farklılaşacaktır çağrı vardır edebilmek ve işlevleri inşa edebilmek. Bir işlev inşa edilebilirse new
, yani ile çağırılabilir new User()
. Bir işlev çağırılabilirse, çağrılmadan çağrılabilir new
(yani normal işlev çağrısı).
İşlev bildirimleri / ifadeleri ile oluşturulan işlevler hem oluşturulabilir hem de çağrılabilir.
Ok işlevleri (ve yöntemleri) yalnızca çağrılabilir.
class
yapıcılar sadece inşa edilebilir.
Çağrılamaz bir işlevi çağırmaya veya yapılandırılamayan bir işlev oluşturmaya çalışıyorsanız, bir çalışma zamanı hatası alırsınız.
Bunu bilerek, aşağıdakileri söyleyebiliriz.
değiştirilebilir:
this
Veya kullanmayan işlevler arguments
.
- Birlikte kullanılan işlevler
.bind(this)
Değil değiştirilebilir:
- Yapıcı fonksiyonları
- Bir prototipe eklenen işlev / yöntemler (genellikle kullandıkları için
this
)
- Variadic fonksiyonlar (kullanıyorlarsa
arguments
(aşağıya bakınız))
Örneklerinizi kullanarak buna daha yakından bakalım:
Yapıcı işlevi
Bu işe yaramaz çünkü ok fonksiyonları ile çağrılamaz new
. Bir işlev bildirimi / ifadesi veya kullanımı kullanmaya devam edin class
.
Prototip yöntemleri
Büyük olasılıkla hayır, çünkü prototip yöntemleri genellikle this
örneğe erişmek için kullanılır . Kullanmazlarsa this
, değiştirebilirsiniz. Bununla birlikte, öncelikle özlü sözdizimini önemsiyorsanız, özlü sözdizimi class
ile kullanın:
class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
Nesne yöntemleri
Benzer şekilde, bir nesne değişmezindeki yöntemler için. Yöntem nesnenin kendisine başvurmak istiyorsa this
, işlev ifadelerini kullanmaya devam edin veya yeni yöntem sözdizimini kullanın:
const obj = {
getName() {
// ...
},
};
Callbacks
Değişir. Dış kısmı taklit ediyorsanız this
veya kullanıyorsanız kesinlikle değiştirmelisiniz .bind(this)
:
// old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
Ama: açıkça geri arama çağıran kod belirlerse this
özellikle jQuery ile, sık sık olay işleyicileri ile olduğu gibi, belirli bir değere ve geri arama kullanımları this
(veya arguments
) kullanarak, olamaz bir ok işlevini kullanın!
Değişken fonksiyonlar
Ok işlevlerinin kendilerine ait olmaması nedeniyle, arguments
bunları bir ok işleviyle değiştiremezsiniz. Bununla birlikte, ES2015, kullanım için bir alternatif sunar arguments
: rest parametresi .
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
İlgili soru:
Diğer kaynaklar: