Bagaimana cara menulis fungsi panah bernama di ES2015?
Anda melakukannya dengan cara Anda mengesampingkan dalam pertanyaan Anda: Anda meletakkannya di sisi kanan tugas atau penginisialisasi properti di mana variabel atau nama properti dapat digunakan sebagai nama oleh mesin JavaScript. Tidak ada yang lain cara untuk melakukannya, tetapi melakukan itu benar dan sepenuhnya dicakup oleh spesifikasi.
Per spec, fungsi ini memiliki nama yang benar, sayHello
:
var sayHello = name => {
console.log(name + ' says hello');
};
Ini didefinisikan dalam Penugasan Operator> Runtime Semantics: Evaluasi di mana ia menyebut operasi abstrakSetFunctionName
(panggilan itu saat ini dalam langkah 1.e.iii).
Serupa dengan itu, Runtime Semantics: PropertyDefinitionEvaluation memanggil SetFunctionName
dan dengan demikian memberikan fungsi ini nama sebenarnya:
let o = {
sayHello: name => {
console.log(`${name} says hello`);
}
};
Mesin modern menetapkan nama internal fungsi untuk pernyataan seperti itu sudah; Edge masih memiliki bit yang membuatnya tersedia name
pada instance fungsi di belakang flag runtime.
Misalnya, di Chrome atau Firefox, buka konsol web lalu jalankan cuplikan ini:
"use strict";
let foo = () => { throw new Error(); };
console.log("foo.name is: " + foo.name);
try {
foo();
} catch (e) {
console.log(e.stack);
}
Di Chrome 51 dan di atasnya dan Firefox 53 dan di atasnya (dan Edge 13 dan di atasnya dengan bendera eksperimental), saat Anda menjalankannya, Anda akan melihat:
foo.name adalah: foo
Kesalahan
di foo (http://stacksnippets.net/js:14:23)
di http://stacksnippets.net/js:17:3
Perhatikan foo.name is: foo
dan Error...at foo
.
Di Chrome 50 dan sebelumnya, Firefox 52 dan sebelumnya, dan Edge tanpa bendera eksperimental, Anda akan melihat ini karena mereka tidak memiliki Function#name
properti (belum):
foo.name adalah:
Kesalahan
di foo (http://stacksnippets.net/js:14:23)
di http://stacksnippets.net/js:17:3
Perhatikan bahwa nama ini hilang dari foo.name is:
, tetapi yang ditampilkan dalam jejak stack. Hanya saja sebenarnya mengimplementasikan name
properti pada fungsi itu prioritas lebih rendah daripada beberapa fitur ES2015 lainnya; Chrome dan Firefox memilikinya sekarang; Edge memilikinya di belakang bendera, mungkin itu tidak akan berada di belakang bendera lebih lama.
Jelas, saya hanya bisa menggunakan fungsi ini setelah saya mendefinisikannya
Benar. Tidak ada sintaks deklarasi fungsi untuk fungsi panah, hanya sintaks ekspresi fungsi , dan tidak ada panah yang setara dengan nama dalam ekspresi fungsi bernama gaya lama ( var f = function foo() { };
). Jadi tidak ada yang setara dengan:
console.log(function fact(n) {
if (n < 0) {
throw new Error("Not defined for negative numbers");
}
return n == 0 ? 1 : n * fact(n - 1);
}(5)); // 120
Anda harus memecahnya menjadi dua ekspresi (saya berpendapat Anda harus tetap melakukannya ) :
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
console.log(fact(5));
Tentu saja, jika Anda harus meletakkan ini di mana satu ekspresi diperlukan, Anda selalu dapat ... menggunakan fungsi panah:
console.log((() => {
let fact = n => {
if (n < 0) {
throw new Error("Not defined for negative numbers.");
}
return n == 0 ? 1 : n * fact(n - 1);
};
return fact(5);
})()); // 120
Saya tidak mengatakan itu cantik, tetapi bekerja jika Anda benar-benar membutuhkan pembungkus ekspresi tunggal.