Saya memiliki fungsi yang saya coba konversi ke sintaks panah baru di ES6 . Ini adalah fungsi bernama:
function sayHello(name) {
console.log(name + ' says hello');
}
Apakah ada cara untuk memberinya nama tanpa pernyataan var:
var sayHello = (name) => {
console.log(name + ' says hello');
}
Jelas, saya hanya bisa menggunakan fungsi ini setelah saya mendefinisikannya. Sesuatu seperti berikut:
sayHello = (name) => {
console.log(name + ' says hello');
}
Apakah ada cara baru untuk melakukan ini di ES6 ?
Jawaban:
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
:Ini didefinisikan dalam Penugasan Operator> Runtime Semantics: Evaluasi di mana ia menyebut operasi abstrak
SetFunctionName
(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: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:
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:
Perhatikan
foo.name is: foo
danError...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):Perhatikan bahwa nama ini hilang dari
foo.name is:
, tetapi yang ditampilkan dalam jejak stack. Hanya saja sebenarnya mengimplementasikanname
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.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:Anda harus memecahnya menjadi dua ekspresi (saya berpendapat Anda harus tetap melakukannya ) :
Tentu saja, jika Anda harus meletakkan ini di mana satu ekspresi diperlukan, Anda selalu dapat ... menggunakan fungsi panah:
Saya tidak mengatakan itu cantik, tetapi bekerja jika Anda benar-benar membutuhkan pembungkus ekspresi tunggal.
sumber
let f = () => { /* do something */ };
memberikan nama ke fungsi,let g = (() => () => { /* do something */ })();
tidak.o.foo = () => {};
tidak memberikan fungsi pada nama. Ini disengaja untuk mencegah kebocoran informasi.Tidak. Sintaks panah adalah bentuk pendek untuk fungsi anonim. Fungsi anonim, yah, anonim.
Fungsi-fungsi yang disebutkan didefinisikan dengan
function
kata kunci.sumber
SetFunctionName
digunakan.let a = () => {};
mendefinisikan fungsi bernama (namanyaa
) baik menurut spesifikasi dan di mesin modern (melemparkan kesalahan untuk melihatnya); mereka hanya belum mendukungname
properti (tetapi masih dalam spesifikasi dan mereka akan sampai di sana pada akhirnya).Jika dengan 'bernama', berarti Anda ingin
.name
properti fungsi panah Anda disetel, Anda beruntung.Jika fungsi panah didefinisikan di sisi kanan ekspresi penugasan, mesin akan mengambil nama di sisi kiri dan menggunakannya untuk mengatur fungsi panah
.name
, misalnyaKarena itu, pertanyaan Anda tampaknya lebih 'dapatkah saya mendapatkan fungsi panah untuk diangkat?'. Jawabannya adalah jawaban "tidak", saya rasa.
sumber
name
properti di mana pun spesifikasi ES2015 mengharuskannya; mereka akan sampai ke sana. Ini adalah salah satu hal terakhir dalam daftar kepatuhan untuk Chrome dan bahkan Chrome 50 tidak memilikinya (Chrome 51 akhirnya akan memilikinya). Detail . Tetapi OP secara khusus mengesampingkan melakukan hal ini (aneh).Tampaknya ini akan dimungkinkan dengan ES7: https://babeljs.io/blog/2015/06/07/react-on-es6-plus#arrow-functions
Contoh yang diberikan adalah:
Perhatikan bahwa untuk mendapatkan ini bekerja dengan babel saya perlu mengaktifkan sintaks ES7 tahap 0 paling eksperimental. Dalam file webpack.config.js saya, saya memperbarui babel loader seperti:
sumber
this.handleOptionsButtonClick = this.handleOptionsButtonClick.bind(this);
constructor() { this.handleOptionsButtonClick = (e) => {…}; }
yang benar-benar setara dengan kode dalam jawaban Anda tetapi sudah berfungsi di ES6. Tidak perlu digunakan.bind
.this
konteks"let a = () => {};
mendefinisikan fungsi panah bernama dipanggila
. Detail .Sebenarnya sepertinya salah satu cara untuk memberi nama fungsi panah (setidaknya pada chrome 77 ...) adalah dengan melakukan ini:
sumber
fn('yourName', ()=>{})
, yang bisa mempertahankan 100% benar panah semantik fungsi, atau lebih baik lagi plugin babel untuk "bernama sintaks panah fungsi":fn yourName() => {}
. Salah satu dari ini akan dikompilasi ke kode di atas. Saya pikir panah bernama akan jadi BADA55untuk menulis fungsi panah bernama Anda dapat menggunakan contoh di bawah ini, di mana saya memiliki kelas bernama LoginClass dan di dalam kelas ini saya menulis sebuah panah bernama fungsi , bernama
successAuth
kelas LoginClass {sumber
INI ES6
Ya saya pikir apa yang Anda kejar adalah sesuatu seperti ini:
sumber
Anda bisa melewati bagian fungsi dan bagian panah untuk membuat fungsi. Contoh:
sumber