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, argumentsve 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 thisvearguments
Ok işlevlerinin kendilerine ait thisveya argumentsbağ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 thisve argumentsdeğerlerine bakın thisve argumentsok 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, thisiçinde oluşturulan nesneyi ifade eder createObject. Ok fonksiyonu durumunda, thisanlamına gelir thisve createObjectkendi 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 thisokumayı 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.
classyapı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:
thisVeya 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 classile 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 thisveya 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, argumentsbunları 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: