Cara menggunakan fungsi anak panah dalam javascript
- 1451
- 313
- Clay Weber
Sintaks fungsi anak panah diperkenalkan dengan ecmascript6: dengan menggunakan sintaks baru ini, dalam beberapa (tetapi tidak semua) kes, kita dapat menghasilkan lebih banyak kod ringkas dan mudah dibaca, terutama apabila fungsi kami hanya mengandungi satu ungkapan. Dalam tutorial ini kita akan melihat bagaimana kita dapat menentukan fungsi anak panah, apakah perbezaan dengan fungsi standard dan apakah kes -kes di mana penggunaan fungsi anak panah tidak sesuai.
Dalam tutorial ini anda akan belajar:
- Apakah fungsi anak panah.
- Bagaimana fungsi anak panah ditakrifkan.
- Perbezaan antara fungsi anak panah dan fungsi standard.
- Kes di mana fungsi anak panah tidak dapat digunakan.
Kategori | Keperluan, konvensyen atau versi perisian yang digunakan |
---|---|
Sistem | Sistem operasi agnostik. |
Perisian | Pemasangan nod untuk mengikuti tutorial ini dalam persekitaran bukan pelayar. |
Yang lain | Pengetahuan mengenai konsep JavaScript dan Objek Berorientasikan. |
Konvensyen | # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak |
Apa itu "fungsi anak panah"?
Fungsi anak panah diperkenalkan dengan ecmascript6: dengan menggunakan sintaks baru ini, kita sering dapat memperoleh lebih banyak kod ringkas, dalam beberapa kes menerjemahkan panggilan balik multi-line ke satu lapisan, terima kasih kepada ciri-ciri seperti pulangan tersirat
. Kerana keanehannya, bagaimanapun, fungsi anak panah tidak dapat menggantikan fungsi standard di mana -mana: terdapat beberapa konteks di mana kita tidak dapat menggunakannya, dan kita akan melihat mengapa.
Dari fungsi standard ke fungsi anak panah
Dalam perenggan ini kita akan melihat contoh bagaimana kita dapat menggantikan fungsi standard dengan fungsi anak panah: kita akan menggunakan panggilan balik fungsi pesanan yang lebih tinggi sebagai contoh yang sempurna ketika melakukan penggantian sedemikian benar -benar baik.
Seperti yang anda ketahui, an fungsi pesanan yang lebih tinggi
adalah fungsi yang mengembalikan fungsi lain, atau menerima fungsi lain sebagai hujah. Dalam contoh ini kita akan menggunakan penapis
, atau array.prototaip.penapis
jika kamu suka. Kaedah ini objek array
, mengambil fungsi sebagai hujahnya, dan mengembalikan array baru, dihuni oleh semua elemen array asal yang positif kepada ujian yang dilaksanakan di dalam fungsi panggil balik.
Mari lihat contoh menggunakan penapis dengan fungsi klasik. Bayangkan kita mempunyai pelbagai objek
, Setiap daripada mereka mewakili watak dari buku "Lord of the Rings":
const conters = [name: 'Frodo', Race: 'Hobbit', name: 'Sam', Race: 'Hobbit', name: 'Legolas', Race: 'Elf', name: ' Aragorn ', bangsa:' man ', name:' boromir ', bangsa:' man ']
Salinan The watak
Array mengandungi 5 elemen; Setiap daripada mereka mempunyai dua sifat: nama
dan perlumbaan
. Sekarang, katakan kita ingin membuat array baru yang dihuni hanya oleh watak -watak yang dimiliki oleh perlumbaan lelaki. Menggunakan penapis dan sintaks fungsi standard, kami menulis:
Const Men = watak.penapis (fungsi penapis (elemen) return element.bangsa == 'man'; );
Salinan Seperti yang dikatakan sebelum ini, penapis
, mengambil fungsi sebagai hujah: Apabila menggunakan sintaks standard, fungsi ini boleh dinamakan atau tanpa nama. Dalam kebanyakan situasi fungsi tanpa nama digunakan sebagai panggilan balik, tetapi demi contoh ini, dan kemudian menyerlahkan salah satu perbezaan antara sintaks fungsi standard dan anak panah, kami memberikan nama kepada fungsi kami: penapis
.
Fungsi panggil balik yang akan digunakan penapis
, hanya mengambil satu wajib
parameter, yang merupakan elemen array asal yang sedang diproses setiap kali. Sekiranya fungsi kembali Benar
, Elemen dimasukkan sebagai ahli array baru, jika fungsi kembali salah
elemen tidak. Dalam kes ini, kami menentukan ujian mudah:
watak.Perlumbaan == 'Man'
Salinan Ujian ini kembali Benar
jika perlumbaan
harta elemen yang sedang diproses, sama dengan rentetan 'lelaki'. Inilah hasil dari apa yang kami tulis di atas:
[name: 'aragorn', bangsa: "man ', name:' boromir ', bangsa:" man']
Salinan Sekarang, katakan kami ingin refactor kod di atas dengan menggunakan fungsi anak panah
. Kami akan menulis:
Const Men = watak.penapis (elemen => elemen.bangsa == 'lelaki');
Salinan Dengan menggunakan Fungsi anak panah
sintaks, kami dapat mencapai hasil yang sama dari contoh sebelumnya dengan hanya satu baris kod: betapa baiknya itu?!. Jangan risau jika pada pandangan pertama sintaks baru membingungkan anda, teruskan membaca.
Sintaks fungsi anak panah
Walaupun kita menentukan fungsi standard dengan menggunakan fungsi
kata kunci, fungsi anak panah ditakrifkan dengan menggunakan =>
simbol. Ini, jelasnya, bukan satu -satunya perbezaan antara kedua -dua: salah satu yang paling penting yang harus kita sorot di sini ialah walaupun fungsi klasik, dalam ekspresi fungsi, boleh dinamakan atau tanpa nama, fungsi anak panah selalu tidak dikenali.
Menentukan hujah dalam fungsi anak panah
Dalam contoh sebelumnya, kerana kita menghilangkan fungsi
kata kunci, perkara pertama yang dapat kita baca adalah elemen
, yang merupakan hujah yang diterima oleh fungsi anak panah. Peraturan yang perlu diikuti apabila menentukan hujah -hujah yang dijangkakan oleh fungsi anak panah adalah mudah: jika fungsi menerima pelbagai argumen, atau tidak ada argumen sama sekali, kita mesti melampirkannya antara kurungan; Sekiranya fungsi itu hanya mengandungi satu hujah, seperti yang berlaku dalam contoh kita, kita dapat menghilangkan kurungan sepenuhnya.
Sebagai contoh, bayangkan kita ingin menentukan fungsi yang mengembalikan produk dua nombor yang diluluskan sebagai hujahnya. Kami akan menulis:
// Oleh kerana fungsi mengambil dua parameter, kita mesti menggunakan kurungan constly multiply = (a, b) => a * b;
Salinan Pulangan tersirat dan pendakap keriting
Dalam semua contoh di atas, anda mungkin dapat melihat ketiadaan perkara lain: pendakap keriting
yang membatalkan badan fungsi. Mengapa kita menghilangkannya? Jika badan fungsi anak panah terdiri daripada hanya satu ungkapan, pendakap keriting boleh ditinggalkan: jika ia berlaku, hasil ungkapan itu secara tersirat dikembalikan:
// Jika kita menghilangkan keriting, hasil ekspresi secara tersirat dikembalikan constly = (a, b) => a * b; Multiply (2,3); 6 // Keputusan adalah 6: ia secara tersirat dikembalikan // Jika kita menggunakan pendakap keriting, hasilnya tidak secara tersirat dikembalikan constly = (a, b) => a * b Multiply (2,3); Hasil yang tidak ditentukan // tidak akan ditentukan, kerana kami tidak mengembalikan hasil ekspresi
Salinan Dalam kod di atas kita menentukan fungsi yang sangat mudah, kalikan
: Fungsi ini mengharapkan dua parameter, oleh itu kita mesti melampirkannya antara kurungan. The =>
simbol mentakrifkan fungsi anak panah. Dalam contoh pertama, kerana kita hanya mempunyai satu ungkapan, yang mengembalikan produk kedua -dua nombor yang diluluskan sebagai parameter, kita dapat menghilangkan pendakap keriting dan memanfaatkan ciri pulangan tersirat.
Dalam contoh kedua kami menggunakan pendakap keriting, oleh itu fungsi itu dikembalikan tidak ditentukan
, Oleh kerana kita tidak mempunyai pulangan tersirat: untuk mendapatkan hasil yang diharapkan yang sepatutnya kita gunakan kembali
secara eksplisit.
Pelbagai pernyataan atau ungkapan dalam badan fungsi
Pendakap keriting juga merupakan satu -satunya cara kita dapat menentukan beberapa pernyataan atau ungkapan di dalam fungsi anak panah. Sebagai contoh, katakan bahawa bukannya mengembalikan produk dua nombor, kami mahu fungsi kami mengeluarkan rentetan, memaparkannya:
const Multiply = (a, b) => const product = a*b; konsol.log ('produk $ a dan $ b ialah $ produk'); Multiply (2,3); Produk 2 dan 3 adalah 6
Salinan Bagaimana jika fungsi anak panah kita harus mengembalikan objek literal, sendiri dibatasi oleh pendakap keriting? Dalam hal ini, kita mesti melampirkan objek literal antara kurungan:
const createChar = (CharaCtername, CharacterRace) => (name: Charactername, Race: CharacterRace); createChar ('gimli', 'kerdil') name: "gimli ', bangsa:" kerdil'
Salinan Bagaimana ini Berlaku di dalam fungsi anak panah
Salah satu yang paling relevan, jika bukan perbezaan yang paling relevan antara fungsi klasik dan fungsi anak panah adalah bagaimana ini
berfungsi. Perbezaan ini adalah sebab utama mengapa dalam beberapa kes kita tidak dapat menggunakan fungsi anak panah, seperti yang akan kita lihat tidak lama lagi. Sebelum menonjolkan perbezaan, Mari rekap bagaimana ini
berfungsi apabila ia digunakan dalam fungsi standard. Perkara pertama yang perlu diingat ialah, nilai ini
ditentukan oleh bagaimana fungsi itu sendiri dipanggil, mari kita lihat beberapa contoh.
Lalai: ini adalah rujukan kepada skop global
Bila ini
digunakan di dalam fungsi mandiri, dan kami tidak bekerja mod yang ketat
, Ini adalah rujukan skop global, iaitu tetingkap
objek pada persekitaran penyemak imbas, atau objek global
dalam nod.js. Dalam keadaan yang sama, tetapi dalam mod yang ketat, ini
akan jadi tidak ditentukan
Dan kami akan menerima ralat:
var i = 20; // di sini kami menggunakan var dan bukannya dibiarkan kerana yang terakhir tidak membuat harta di skop global. fungsi foo () konsol.log (ini.i); // mod non-strict foo () 20 // mod ketat foo () typeError: tidak dapat membaca harta 'i' undefined
Salinan Mengikat tersirat
Apabila fungsi standard dirujuk di dalam objek, dan fungsi itu dipanggil dengan objek itu sebagai konteks
, Menggunakan notasi titik, ini
menjadi rujukan kepada objek itu. Ini adalah apa yang kita panggil mengikat tersirat
:
fungsi foo () konsol.log (ini.i); biarkan objek = i: 20, foo: foo // harta foo adalah rujukan kepada fungsi foo objek.foo () // ini adalah rujukan kepada objek, jadi ini.Saya adalah objek.i 20
Salinan Mengikat eksplisit
Kami mengatakan bahawa kami menggunakan mengikat eksplisit
ketika kita secara jelas menyatakan apa ini
harus rujukan. Ia dapat dicapai dengan menggunakan Panggilan
, memohon
atau mengikat
Kaedah fungsi (yang dalam JavaScript sendiri adalah objek kelas pertama. Ingatlah kes pertama yang kita nyatakan di atas, apabila mengikat lalai berlaku:
var i = 20; fungsi foo () konsol.log (ini.i); const object = i: 100 foo () // ini akan mengeluarkan 20 atau menghasilkan jenisError dalam mod yang ketat. // Sekiranya kita secara eksplisit menetapkan ini menjadi rujukan untuk membantah perkara -perkara yang berubah. // Panggil dan memohon melaksanakan fungsi dengan segera dengan konteks baru: foo.panggilan (objek) // output adalah 100 foo.Sapukan (objek) // output adalah 100 // mengikat sebaliknya, mengembalikan fungsi baru dengan konteks yang ditentukan. Biarkan Boundfoo = Foo.mengikat (objek) boundfoo () // output adalah 100
Salinan Ini adalah beberapa perbezaan antara Panggilan
, memohon
dan mengikat
: yang relevan adalah bahawa yang terakhir kembali a fungsi baru
terikat pada konteks yang ditentukan, manakala dengan dua yang lain, fungsi, terikat pada konteks yang ditentukan, dilaksanakan dengan segera. Terdapat perbezaan lain, tetapi kita tidak akan melihatnya di sini. Yang penting ialah memahami bagaimana kerja mengikat secara eksplisit.
Bagaimana fungsi anak panah berbeza ini
menganggap?
Dalam semua kes dan contoh di atas, kita melihat bagaimana, apabila menggunakan fungsi standard, nilai ini
bergantung pada bagaimana fungsi dipanggil. Fungsi anak panah, sebaliknya, gunakan leksikal ini
: mereka tidak mempunyai sendiri ini
, Tetapi selalu gunakan ini
dari skop yang dilampirkan mereka. Contoh biasa di mana ini dapat menghasilkan kesan yang tidak dijangka adalah pada pendengar acara. Katakan kami mempunyai butang dengan ID "Button1", dan kami ingin menukar teksnya apabila ia diklik:
Klik saya! // pendengar acara dengan fungsi standard sebagai dokumen panggil balik.getElementById ('Button1').addEventListener ('klik', fungsi () ini.innertext = "diklik!";)
Salinan Kodnya berfungsi dengan sempurna, dan apabila butang diklik, teksnya berubah seperti yang diharapkan. Bagaimana jika kita menggunakan fungsi anak panah dalam kes ini? Katakan kita menulis seperti ini:
dokumen.getElementById ('Button1').addEventListener ('klik', () => ini.innertext = "diklik!";)
Salinan Kod di atas tidak berfungsi, mengapa? Mudah: Kerana, seperti yang kita katakan sebelumnya, semasa dalam contoh pertama, ini
di dalam fungsi panggil balik standard merujuk objek di mana peristiwa berlaku (butang), apabila kita menggunakan fungsi anak panah ini
diwarisi dari skop induk, yang dalam hal ini adalah tetingkap
objek. Demi kesempurnaan, kita harus mengatakan bahawa contoh di atas dapat dengan mudah ditetapkan untuk bekerja dengan fungsi anak panah:
dokumen.getElementById ('Button1').addEventListener ('klik', event => event.sasaran.innertext = "diklik!";)
Salinan Kali ini kod berfungsi kerana kami tidak menggunakan ini
untuk merujuk butang, tetapi kami membiarkan fungsi kami menerima satu hujah, iaitu peristiwa
. Dalam badan fungsi yang kami gunakan peristiwa.sasaran
untuk merujuk objek yang menghantar acara tersebut.
Atas sebab yang sama yang kita nyatakan di atas, fungsi anak panah tidak boleh digunakan sebagai kaedah objek atau kaedah prototaip:
// Fungsi anak panah tidak berfungsi sebagai kaedah objek ... const objek1 = i: 1000, foo: () => konsol.log ('Nilai i ialah $ ini.i ') objek1.foo () nilai saya tidak ditentukan // ... dan mereka tidak berfungsi sebagai kaedah prototaip. const orang = fungsi (nama, umur) ini.nama = nama; ini.umur = umur; Orang.prototaip.memperkenalkan = () => konsol.log ('nama saya $ ini.nama dan saya $ ini.umur tahun '); const Jack = orang baru ('Jack', 100); Jack.Namakan 'Jack' Jack.Umur 100 Jack.memperkenalkan () nama saya tidak ditentukan dan saya berumur tahun yang tidak ditentukan
Salinan Kesimpulan
Sintaks fungsi anak panah adalah ciri yang sangat bagus diperkenalkan dengan ecmascript6. Dengan cara baru ini menentukan fungsi kita boleh menulis kod yang lebih pendek dan bersih. Kami melihat bagaimana untuk menentukan fungsi anak panah, dan bagaimana sintaks baru berfungsi.
Kami juga melihat mengapa fungsi anak panah tidak dapat menggantikan fungsi standard dalam semua keadaan, kerana mereka tidak mempunyai sendiri ini
, dan menggunakan salah satu skop yang dilampirkan: ini, seperti yang kita lihat dalam tutorial ini, menjadikannya tidak boleh digunakan sebagai kaedah atau pembina. Sekiranya anda berminat dengan tutorial JavaScript yang lain, tunggu: dalam tutorial seterusnya kami akan bercakap mengenai ambil
, fungsi. Sementara itu, anda boleh menyemak artikel kami mengenai janji.
Tutorial Linux Berkaitan:
- Advanced Bash Regex dengan contoh
- Pengenalan kepada Gelung JavaScript
- Pengenalan kepada Automasi, Alat dan Teknik Linux
- Menguasai Gelung Skrip Bash
- Perkara yang hendak dipasang di Ubuntu 20.04
- Gelung bersarang dalam skrip bash
- Bash regexps untuk pemula dengan contoh
- Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
- Tutorial Debugging GDB untuk Pemula
- Buat pengalihan dan tulis semula peraturan ke dalam .Htaccess di Apache ..