tl; dr: Tidak! Fungsi panah dan deklarasi fungsi / ekspresi tidak setara dan tidak dapat diganti secara membabi buta.
Jika fungsi yang ingin Anda ganti tidak digunakan this
, arguments
dan tidak dipanggil dengan new
, maka ya.
Seperti yang sering: itu tergantung . Fungsi panah memiliki perilaku yang berbeda dari deklarasi / ekspresi fungsi, jadi mari kita lihat perbedaannya terlebih dahulu:
1. Leksikal this
danarguments
Fungsi panah tidak memiliki this
atau arguments
mengikat sendiri . Sebaliknya, pengidentifikasi tersebut diselesaikan dalam ruang lingkup leksikal seperti variabel lainnya. Itu berarti bahwa di dalam fungsi panah, this
dan arguments
merujuk ke nilai-nilai this
dan arguments
di lingkungan fungsi panah didefinisikan dalam (yaitu "di luar" fungsi panah):
// 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
Dalam kasus ekspresi fungsi, this
merujuk ke objek yang dibuat di dalam createObject
. Dalam kasus panah fungsi, this
mengacu this
dari createObject
itu sendiri.
Ini membuat fungsi panah berguna jika Anda perlu mengakses this
lingkungan saat ini:
// currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
Perhatikan bahwa ini juga berarti bahwa tidak mungkin untuk mengatur fungsi panah this
dengan .bind
atau .call
.
Jika Anda tidak terlalu mengenal this
, pertimbangkan untuk membaca
2. Fungsi panah tidak dapat dipanggil dengan new
ES2015 membedakan antara fungsi yang bisa dipanggil dan fungsi yang bisa dikonstruksikan . Jika suatu fungsi dapat dibangun, itu dapat dipanggil dengan new
, yaitu new User()
. Jika suatu fungsi dipanggil, itu dapat dipanggil tanpa new
(yaitu panggilan fungsi normal).
Fungsi yang dibuat melalui deklarasi / ekspresi fungsi keduanya dapat dibangun dan dapat dipanggil.
Fungsi panah (dan metode) hanya dapat dipanggil.
class
konstruktor hanya dapat dibangun.
Jika Anda mencoba memanggil fungsi yang tidak dapat dipanggil atau untuk membangun fungsi yang tidak dapat dibangun, Anda akan mendapatkan kesalahan runtime.
Mengetahui hal ini, kita dapat menyatakan yang berikut.
Tergantikan:
- Fungsi yang tidak menggunakan
this
atau arguments
.
- Fungsi yang digunakan dengan
.bind(this)
Tidak tergantikan:
- Fungsi konstruktor
- Fungsi / metode ditambahkan ke prototipe (karena biasanya mereka gunakan
this
)
- Fungsi variadik (jika digunakan
arguments
(lihat di bawah))
Mari kita lihat lebih dekat ini menggunakan contoh Anda:
Fungsi konstruktor
Ini tidak akan berfungsi karena fungsi panah tidak dapat dipanggil dengan new
. Tetap menggunakan fungsi deklarasi / ekspresi atau gunakan class
.
Metode prototipe
Kemungkinan besar tidak, karena metode prototipe biasanya digunakan this
untuk mengakses instance. Jika tidak digunakan this
, maka Anda dapat menggantinya. Namun, jika Anda terutama memperhatikan sintaksis ringkas, gunakan class
dengan sintaksis metode ringkasnya:
class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
Metode objek
Demikian pula untuk metode dalam objek literal. Jika metode ingin merujuk objek itu sendiri melalui this
, tetap menggunakan ekspresi fungsi, atau gunakan sintaks metode baru:
const obj = {
getName() {
// ...
},
};
Telepon balik
Tergantung. Anda harus menggantinya jika Anda menggunakan aliasing luar this
atau menggunakan .bind(this)
:
// old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
Tetapi: Jika kode yang memanggil panggilan balik secara eksplisit ditetapkan this
ke nilai tertentu, seperti yang sering terjadi dengan penangan acara, terutama dengan jQuery, dan panggilan balik menggunakan this
(atau arguments
), Anda tidak dapat menggunakan fungsi panah!
Fungsi variadik
Karena fungsi panah tidak memiliki fungsi panah sendiri arguments
, Anda tidak dapat dengan mudah menggantinya dengan fungsi panah. Namun, ES2015 memperkenalkan alternatif untuk menggunakan arguments
: parameter sisanya .
// old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
Pertanyaan terkait:
Sumber lebih lanjut: