Selepas pelepasan ECMAScript 2015 (juga dikenali sebagai ES6), fungsi anak panah JavaScript muncul. Terima kasih kepada sintaks ringkas dan bagaimana untuk mengendalikan kata kunci
, fungsi anak panah dengan cepat menjadi salah satu ciri kegemaran pemaju. this
function
dan kata kunci {}
apabila hanya ada satu ungkapan. return
this
luaran keadaan konteks. this
function
dan hilang this
objek. arguments
.map()
, .sort()
, .forEach()
, .filter()
, .reduce()
, sintaks fungsi anak panah: menulis semula fungsi biasa
Fungsiadalah seperti resipi di mana anda boleh menyimpan arahan yang berguna untuk mencapai apa yang perlu berlaku dalam program anda, seperti melakukan tindakan atau mengembalikan nilai. Dengan menghubungi fungsi anda, anda boleh melakukan langkah -langkah yang terkandung dalam resipi. Anda boleh melakukan ini setiap kali anda memanggil fungsi tanpa menulis semula resipi berulang kali.
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
const sayHiStranger = function () { return 'Hi, stranger!' }
const sayHiStranger = () => 'Hi, stranger'
<🎜> Kelebihan termasuk: <🎜>
function
kata kunci return
kata kunci {}
Dalam JavaScript, fungsi ini adalah "warganegara kelas pertama". Anda boleh menyimpan fungsi dalam pembolehubah, menyampaikannya sebagai hujah kepada fungsi lain, dan mengembalikannya sebagai nilai dari fungsi lain. Anda boleh melakukan semua ini dengan fungsi anak panah JavaScript.
Dalam contoh di atas, fungsi tidak mempunyai parameter. Dalam kes ini, anda perlu menambah satu set kurungan kosong () sebelum simbol anak panah lemak (= & gt;). Ini juga benar apabila anda membuat fungsi dengan pelbagai parameter:
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
const sayHiStranger = function () { return 'Hi, stranger!' }
const sayHiStranger = () => 'Hi, stranger'
pulangan tersirat
. return
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
. return
Fungsi anak panah dalam fungsi
const greeter = greeting => name => `${greeting}, ${name}!`
diperluas melalui satu siri pernyataan dan akhirnya mengembalikan objek. Ini menjadikannya tidak dapat dielakkan untuk menggunakan pendakap keriting di sekitar badan fungsi. .map()
. return
Jika fungsi anda mengembalikan objek literal menggunakan pulangan tersirat , anda perlu melampirkan objek dalam kurungan. Kegagalan berbuat demikian akan mengakibatkan kesilapan kerana enjin JavaScript tersilap mengepung penyokong objek literal ke dalam pendakap fungsi. Seperti yang anda perhatikan di atas, anda tidak boleh meninggalkan kata kunci return
apabila anda menggunakan pendakap keriting dalam fungsi anak panah.
versi yang lebih pendek dari kod sebelumnya menunjukkan sintaks ini:
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Fungsi yang tidak mempunyai pengenal nama antara kata kunci function
dan senarai parameter dipanggil fungsi tanpa nama . Inilah bagaimana ekspresi fungsi tanpa nama biasa kelihatan seperti:
const sayHiStranger = function () { return 'Hi, stranger!' }
Fungsi anak panah adalah semua fungsi tanpa nama:
const sayHiStranger = () => 'Hi, stranger'
Bermula dari ES6, pembolehubah dan kaedah dapat menyimpulkan nama fungsi tanpa nama berdasarkan kedudukan sintaksis mereka, menggunakan atribut name
mereka. Ini memungkinkan untuk mengenali fungsi apabila memeriksa nilai atau melaporkan ralat.
semak dengan anonymousarrowfunc:
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
Perhatikan bahawa atribut ini disimpulkan hanya wujud apabila fungsi tanpa nama diberikan kepada pembolehubah, seperti yang ditunjukkan dalam contoh di atas. Jika anda menggunakan fungsi tanpa nama sebagai fungsi panggil balik, fungsi praktikal ini hilang. Ini digambarkan oleh demonstrasi berikut, di mana fungsi tanpa nama dalam kaedah name
tidak boleh menggunakan atribut .setInterval()
: name
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
ini masih tidak boleh digunakan sebagai pengenal yang sesuai yang mana anda boleh merujuk fungsi dari dalam fungsi -contohnya, untuk rekursi, peristiwa yang tidak bertaburan, dll. name
Oleh kerana saya fikir fungsi tanpa nama tidak sesuai untuk kegunaan yang kerap dalam program, saya tidak suka menggunakan borang fungsi arrow = & gt; - "Anda tidak tahu js"bagaimana menangani kata kunci ini
. Khususnya, kata kunci this
di dalam fungsi anak panah tidak akan dibangkitkan. this
Ini adalah butang. Mengklik butang mencetuskan kaunter terbalik dari 5 hingga 1, yang dipaparkan pada butang itu sendiri.
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
adalah ungkapan fungsi tanpa nama biasa, bukan fungsi anak panah. Kenapa? Jika anda log masuk fungsi .addEventListener()
, anda akan melihat bahawa ia merujuk elemen butang dengan pendengar yang dilampirkan, yang tepat hasil yang diharapkan dan apa yang perlu dilakukan oleh program seperti yang dirancang. this
// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Sekarang, this
tidak lagi memetik butang. Sebaliknya, ia merujuk objek tetingkap: (imej harus dimasukkan di sini, tetapi kerana imej tidak dapat dimasukkan secara langsung, ia ditinggalkan di sini)
Ini bermakna bahawa jika anda ingin menambah kelas ke butang menggunakan this
selepas mengklik butang, kod anda tidak akan berfungsi, seperti yang ditunjukkan dalam contoh berikut:
const sayHiStranger = function () { return 'Hi, stranger!' }
Mesej ralat dalam konsol adalah seperti berikut: (gambar harus dimasukkan di sini, tetapi kerana gambar tidak dapat dimasukkan secara langsung, ia ditinggalkan di sini)
Apabila anda menggunakan fungsi anak panah dalam JavaScript, nilai kata kunci this
tidak dipertanggungjawabkan. Ia mewarisi dari skop induk (ini dipanggil skop leksikal). Dalam kes ini, fungsi anak panah yang dipersoalkan diluluskan sebagai hujah kepada kaedah startBtn.addEventListener()
, yang berada dalam skop global. Oleh itu, this
dalam pengendali fungsi juga terikat pada skop global - iaitu, objek tetingkap.
Jadi jika anda mahu this
untuk merujuk butang permulaan dalam program anda, cara yang betul adalah menggunakan fungsi biasa, bukan fungsi anak panah.
Perkara seterusnya yang perlu diperhatikan ialah kod dalam kaedah .setInterval()
dalam demonstrasi di atas. Di sini anda juga akan mencari fungsi tanpa nama, tetapi kali ini ia adalah fungsi anak panah. Kenapa?
Perhatikan bahawa jika anda menggunakan fungsi biasa, apakah nilai this
menjadi:
const sayHiStranger = () => 'Hi, stranger'
Adakah ia menjadi elemen butang? Sama sekali tidak. Ia akan menjadi objek tetingkap! (Gambar harus dimasukkan di sini, tetapi kerana gambar tidak dapat dimasukkan secara langsung, ia ditinggalkan di sini)
Malah, konteksnya telah berubah kerana this
kini berada dalam fungsi yang tidak terikat atau global yang diluluskan sebagai hujah kepada .setInterval()
. Oleh itu, nilai kata kunci this
juga berubah kerana ia kini terikat pada skop global.
Dalam kes ini, helah umum adalah untuk memasukkan pembolehubah lain untuk menyimpan nilai kata kunci this
supaya ia terus merujuk elemen yang diharapkan -dalam hal ini elemen butang:
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
anda juga boleh menggunakan .bind()
untuk menyelesaikan masalah ini:
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
Menggunakan fungsi anak panah, masalahnya hilang sepenuhnya. Berikut adalah nilai this
apabila menggunakan fungsi anak panah:
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
(gambar harus dimasukkan di sini, tetapi kerana gambar tidak dapat dimasukkan secara langsung, ia ditinggalkan di sini)
Kali ini, konsol mencatatkan butang, yang kami mahukan. Malah, program ini akan mengubah teks butang, jadi ia memerlukan this
untuk merujuk elemen butang:
// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
Fungsi anak panah tidak mempunyai konteks this
sendiri . Mereka mewarisi dari nilai this
ibu bapa, dan kerana ciri ini mereka menjadi pilihan yang sangat baik dalam situasi di atas.
Fungsi anak panah bukan sekadar cara baru yang mewah untuk menulis fungsi JavaScript. Mereka mempunyai batasan sendiri, yang bermaksud bahawa dalam beberapa kes anda tidak mahu menggunakannya. Pengendali klik dalam demonstrasi sebelumnya adalah contoh, tetapi ini bukan satu -satunya. Mari kita periksa beberapa lagi.
Fungsi anak panah tidak digunakan dengan baik sebagai kaedah objek. Berikut adalah contoh.
Pertimbangkan objek NetflixSeries ini, yang mempunyai beberapa sifat dan beberapa kaedah. Panggil console.log(netflixSeries.getLikes())
harus mencetak mesej yang mengandungi bilangan suka semasa.
console.log(netflixSeries.addLike())
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
pulangan "terima kasih kerana suka undefined, yang kini mempunyai nan suka". Oleh itu, .getLikes()
dan .addLike()
tidak boleh merujuk kepada sifat objek this.title
dan this.likes
masing -masing. title
likes
Masalah yang sama terletak pada skop leksikal fungsi anak panah.
this
Sudah tentu, penyelesaiannya adalah menggunakan fungsi biasa:
Gunakan fungsi anak panah perpustakaan pihak ketiga
const sayHiStranger = function () { return 'Hi, stranger!' }
this
Sebagai contoh, dalam pengendali acara jQuery,
this
const sayHiStranger = () => 'Hi, stranger'
Berikut adalah contoh selanjutnya menggunakan Vue: this
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
,
mengikat kepada contoh Vue, jadi mesej "Hello, World!"const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
Walau bagaimanapun, jika kita menggunakan fungsi anak panah, created
akan menunjuk kepada skop induk, yang tidak mempunyai atribut this
:
this
Fungsi anak panah tidak mempunyai objek argumen message
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
Apabila anda memanggil fungsi tersebut, anda akan menerima mesej ralat berikut: Uncaught ReferenceRor: Argumen tidak ditakrifkan. Ini bermakna bahawa objek arguments
tidak tersedia dalam fungsi anak panah. Malah, menggantikan fungsi anak panah dengan fungsi biasa dapat menyelesaikan masalah:
const sayHiStranger = function () { return 'Hi, stranger!' }
, anda tidak boleh menggunakan fungsi anak panah. arguments
benar -benar mahu menggunakan fungsi anak panah untuk menyalin fungsi yang sama? Satu perkara yang boleh anda lakukan ialah menggunakan parameter yang tinggal ES6 (...). Inilah cara menulis semula fungsi anda:
Kesimpulanconst sayHiStranger = () => 'Hi, stranger'
, this
, .map()
, .sort()
, .forEach()
dan .filter()
. Tetapi ingat: Fungsi anak panah tidak menggantikan fungsi JavaScript biasa. Ingat, gunakannya hanya jika fungsi anak panah adalah alat yang betul. .reduce()
soalan yang sering ditanya mengenai fungsi anak panah JavaScript
bagaimana untuk menentukan fungsi anak panah?
Apakah perbezaan antara fungsi anak panah dan fungsi biasa?
sendiri. Sebaliknya, mereka mewarisi nilai this
dari skop leksikal sekitarnya.
Fungsi anak panah tidak boleh digunakan sebagai pembina, yang bermaksud anda tidak boleh membuat contoh objek menggunakan this
.
Fungsi anak panah tidak mempunyai objek sendiri new
. Sebaliknya, mereka mewarisi skop tertutup arguments
.
Fungsi anak panah lebih mudah dan lebih sesuai untuk operasi satu baris mudah. arguments
mengikat, kerana mereka mewarisi konteks sekitarnya. Ini dapat memudahkan corak pengekodan tertentu dan mengurangkan keperluan untuk penyelesaian seperti this
, bind
atau apply
. call
Walaupun fungsi anak panah berguna untuk banyak senario, mereka mungkin tidak berfungsi dalam semua kes. Mereka paling sesuai untuk fungsi pendek dan mudah. Fungsi tradisional mungkin lebih sesuai untuk fungsi atau fungsi kompleks yang memerlukan konteks this
mereka sendiri.
Fungsi anak panah diperkenalkan dalam ECMAScript 6 (ES6) dan disokong oleh pelayar moden dan versi Node.js. Mereka digunakan secara meluas dalam pembangunan JavaScript moden.
tidak boleh digunakan sebagai pembina, tidak mempunyai objek sendiri arguments
, dan tidak begitu sesuai untuk kaedah yang memerlukan konteks this
dinamik. Selain itu, sintaks ringkas mereka mungkin tidak sesuai untuk fungsi yang mengandungi pelbagai kenyataan.
Ya, fungsi anak panah boleh digunakan untuk kaedah dalam objek atau kelas. Walau bagaimanapun, ingat bahawa fungsi anak panah tidak mempunyai this
mereka sendiri, jadi mereka mungkin tidak berfungsi seperti yang diharapkan dalam kaedah yang memerlukan konteks this
dinamik.
Apabila mengembalikan literasi objek secara langsung dari fungsi anak panah, objek perlu disertakan dalam kurungan untuk mengelakkan kekeliruan dengan blok fungsi. Sebagai contoh: () = & gt;
Ya, jika fungsi anak panah menerima parameter tunggal, kurungan di sekitar parameter boleh ditinggalkan. Sebagai contoh, x = & gt;
Atas ialah kandungan terperinci Fungsi anak panah di JavaScript: Sintaks Fat & Ringkas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!