国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ES 2017: async函數(shù) vs AsyncFunction物件 vs async函數(shù)表達式
P粉459440991
P粉459440991 2024-03-25 23:44:59
0
1
582

我剛剛閱讀了有關(guān) async 函數(shù) 的內(nèi)容,並發(fā)現(xiàn)了 ES2017 的一些類似功能。它造成了很多混亂,我只想問:

  1. async functionAsyncFunction(用於建立非同步函數(shù))和非同步函數(shù)表達式(我認為這只是另一個非同步函數(shù))之間有什麼區(qū)別?
  2. 什麼時候應(yīng)該使用一種格式而不是另一種格式?

強調(diào)每個人的怪癖和表現(xiàn)將不勝感激!

P粉459440991
P粉459440991

全部回覆(1)
P粉287726308

在 Javascript 中建立函數(shù)有四種方法。在 Javascript 中還有四種建立非同步函數(shù)的方法,它們是彼此精確的鏡像。

為了示範(fàn)這是如何運作的,我使用了一個簡單的 sleep 函數(shù),在全域宣告:

function sleep(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve();
        }, time);
    });
}

函數(shù)宣告

function speak() { return 'Hi'; }
async function speak() { await sleep(1000); return 'Hi'; }

這是宣告函數(shù)最簡單的方法。它可以聲明一次並提升到目前函數(shù)作用域的頂部。

函數(shù)宣告和非同步函數(shù)宣告完全相同,只是 async 函數(shù)總是傳回一個 Promise 並允許您使用 await

函數(shù)表達式

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

函數(shù)表達式看起來非常像函數(shù)宣告。然而,它們並沒有被提升到函數(shù)作用域的頂端。您可以根據(jù)需要多次重新定義它們。它們可以內(nèi)聯(lián)定義。它們可以是匿名的,也可以是命名的:如果它們被命名,那麼名稱引用該函數(shù)範(fàn)圍內(nèi)的函數(shù)。

函數(shù)表達式和非同步函數(shù)表達式完全相同,只是 async 函數(shù)總是傳回一個 Promise 並允許您使用 await。

箭頭函數(shù)

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

箭頭函數(shù)是一種快速且簡短的方法定義一個函數(shù),在 ES2015 (ES6) 中引入。它們在大多數(shù)方面與函數(shù)表達式等效,只是它們始終是匿名的,並且 this 的值始終是詞法綁定的,即從外部作用域繼承。

箭頭函數(shù)和非同步箭頭函數(shù)完全相同,只是 async 函數(shù)總是傳回一個 Promise 並允許您使用 await。 (它們在上面的語句中略有不同,因為每個非同步函數(shù)內(nèi)部都有多個語句。這表示這些語句需要包含在一個區(qū)塊{} 中,並且return需要是明確的。這也是正確的超過一條語句長度的普通箭頭函數(shù)。)

函數(shù)建構(gòu)子

let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')

函數(shù)建構(gòu)函數(shù)可讓您使用字串動態(tài)定義函數(shù)。請注意,它們始終在全域範(fàn)圍內(nèi)運行,並且無法存取定義它們的範(fàn)圍。它們僅在極少數(shù)情況下有用。我個人不認為非同步函數(shù)構(gòu)造函數(shù)會有什麼用處。 ES2017的作者同意我的觀點,因為 AsyncFunction 不是全域?qū)ο?,必須先使?const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor 取得。

使用函數(shù)建構(gòu)函式建立的函式和使用匿名函式建構(gòu)函式建立的函式完全相同,只是 async 函式總是傳回一個 Promise 並允許你使用 await。 (但你已經(jīng)猜到了,對吧?)

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板