Rumah > Soal Jawab > teks badan
Saya baru sahaja membaca tentang async 函数
dan menemui beberapa ciri serupa untuk ES2017. Ia menyebabkan banyak kekeliruan dan saya hanya ingin bertanya:
async function
、AsyncFunction
(digunakan untuk mencipta fungsi async) dan ungkapan fungsi async (yang saya fikir hanyalah satu lagi fungsi async)? Sorotan keanehan dan persembahan semua orang akan sangat dihargai!
P粉2877263082024-03-26 00:44:29
Terdapat empat cara untuk mencipta fungsi dalam Javascript. Terdapat juga empat cara untuk mencipta fungsi tak segerak dalam Javascript, yang merupakan cermin tepat antara satu sama lain.
Untuk menunjukkan cara ini berfungsi, saya menggunakan fungsi sleep
mudah, diisytiharkan secara global:
function sleep(time) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(); }, time); }); }
function speak() { return 'Hi'; } async function speak() { await sleep(1000); return 'Hi'; }
Ini adalah cara paling mudah untuk mengisytiharkan fungsi. Ia boleh diisytiharkan sekali dan dinaikkan ke bahagian atas skop fungsi semasa.
Pengisytiharan fungsi adalah sama seperti pengisytiharan fungsi async, kecuali async
函数始终返回一个 Promise 并允许您使用 await
.
let speak = function() { return 'Hi'; } // anonymous function expression let speak = function speakFn() { return 'Hi'; } // named function expression let speak = async function() { await sleep(1000); return 'Hi'; } // anonymous asynchronous function expression let speak = async function speakFn() { await sleep(1000); return 'Hi'; } // named asynchronous function expression
Ekspresi fungsi kelihatan sangat mirip dengan pengisytiharan fungsi. Walau bagaimanapun, mereka tidak dinaikkan pangkat ke bahagian atas skop fungsi. Anda boleh mentakrifkan semula mereka seberapa banyak yang diperlukan. Mereka boleh ditakrifkan sebaris. Mereka boleh tanpa nama atau dinamakan: jika mereka dinamakan, nama itu merujuk kepada fungsi dalam skop fungsi itu.
Ekspresi fungsi adalah betul-betul sama dengan ungkapan fungsi tak segerak, kecuali async
函数始终返回一个 Promise 并允许您使用 await
.
let speak = word => 'Hi ' + word; // one parameter let speak = (word1, word2) => 'Hi ' + word1 + word2; // multiple parameters let speak = async word => { await sleep(1000); return 'Hi ' + word; } // one parameter let speak = async (word1, word2) => { await sleep(1000); return 'Hi ' + word1 + word2; } // multiple parameters
Fungsi anak panah ialah cara cepat dan singkat untuk mentakrifkan fungsi, yang diperkenalkan dalam ES2015 (ES6). Ia bersamaan dengan ungkapan fungsi dalam kebanyakan aspek, kecuali ia sentiasa tanpa nama dan nilai this
sentiasa terikat secara leksikal, iaitu diwarisi daripada skop luar.
Fungsi anak panah adalah sama seperti fungsi anak panah async, cuma async
函数始终返回一个 Promise 并允许您使用 await
。 (它们在上面的语句中略有不同,因为每个异步函数内部都有多个语句。这意味着这些语句需要包含在一个块 {}
中,并且 return
. (Ia sedikit berbeza dalam penyataan di atas kerana terdapat berbilang penyataan di dalam setiap fungsi async. Ini bermakna penyataan ini perlu disertakan dalam blok {}
dan keperluan return code> untuk menjadi eksplisit. Ini juga benar untuk fungsi anak panah biasa yang lebih panjang daripada satu pernyataan.)
let speak = new Function('word', 'return "Hi " + word;'); let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')
Pembina fungsi membolehkan anda menentukan fungsi secara dinamik menggunakan rentetan. Ambil perhatian bahawa mereka sentiasa berjalan dalam skop global dan tidak mempunyai akses kepada skop yang ditakrifkan. Mereka hanya berguna dalam situasi yang jarang berlaku. Secara peribadi saya tidak fikir pembina fungsi async akan berguna. Pengarang ES2017 bersetuju dengan saya kerana AsyncFunction
不是全局对象,必须首先使用 const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
mendapat.
Fungsi yang dibuat menggunakan pembina fungsi adalah sama seperti fungsi yang dibuat menggunakan pembina fungsi tanpa nama, kecuali async
函数始终返回一个 Promise 并允许您使用 await
. (Tetapi anda sudah meneka kan?)