先ほど async 関数 について読んだところ、ES2017 にも同様の機能がいくつか見つかりました。多くの混乱を引き起こしているので、一つお聞きしたいのですが:
async 関数
async function
AsyncFunction
皆さんの癖やパフォーマンスのハイライトを大歓迎です。
JavaScript で関数を作成するには 4 つの方法があります。 JavaScript で非同期関数を作成する方法も 4 つあり、これらは互いに完全にミラーリングされています。
これがどのように機能するかを示すために、グローバルに宣言された単純な sleep 関数を使用しました。 リーリー
sleep
async 関数が常に Promise を返し、await を使用できる点を除いて、非同期関数宣言とまったく同じです。
関数が常に Promise を返し、
を使用できる点を除いて、非同期関数宣言とまったく同じです。
async 関数が常に Promise を返し、await を使用できる点を除いて、非同期関数式とまったく同じです。
を使用できる点を除いて、非同期関数式とまったく同じです。
アロー関数は、ES2015 (ES6) で導入された関数を定義するための迅速かつ短い方法です。これらは、常に匿名であること、this の値が常に字句的に束縛されること、つまり外部スコープから継承されることを除いて、ほとんどの点で関数式と同等です。
の値が常に字句的に束縛されること、つまり外部スコープから継承されることを除いて、ほとんどの点で関数式と同等です。
async 関数が常に Promise を返し、await を使用できる点を除いて、非同期アロー関数とまったく同じです。 (各非同期関数内に複数のステートメントがあるため、上記のステートメントとは若干異なります。つまり、これらのステートメントはブロック {} と return に含める必要があります。これは、1 つのステートメントよりも長い通常のアロー関数にも当てはまります。)
を使用できる点を除いて、非同期アロー関数とまったく同じです。 (各非同期関数内に複数のステートメントがあるため、上記のステートメントとは若干異なります。つまり、これらのステートメントはブロック
と
に含める必要があります。これは、1 つのステートメントよりも長い通常のアロー関数にも当てはまります。)
まれな状況でのみ役に立ちます。個人的には、非同期関数コンストラクターは役に立たないと思います。 AsyncFunction はグローバル オブジェクトではなく、最初に const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor を使用して取得する必要があるため、ES2017 の作者も私に同意しています。 関数コンストラクターを使用して作成された関数は、
const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
関数が常に Promise を返し、await を使用できることを除いて、匿名関数コンストラクターを使用して作成された関数とまったく同じです。 (でも、もうお分かりでしょう?)
await
JavaScript で関数を作成するには 4 つの方法があります。 JavaScript で非同期関数を作成する方法も 4 つあり、これらは互いに完全にミラーリングされています。
これがどのように機能するかを示すために、グローバルに宣言された単純な
関数宣言sleep
関数を使用しました。 リーリーリーリー
これは関数を宣言する最も簡単な方法です。一度宣言すると、現在の関数スコープの先頭にホイストできます。async
関数式関数が常に Promise を返し、
awaitを使用できる点を除いて、非同期関数宣言とまったく同じです。
リーリー
関数式は関数宣言と非常によく似ています。ただし、これらは関数スコープの最上位には昇格されません。必要に応じて何度でも再定義できます。これらはインラインで定義できます。これらは匿名または名前付きにすることができます。名前付きの場合、その名前はその関数のスコープ内の関数を参照します。async
アロー関数関数が常に Promise を返し、
awaitを使用できる点を除いて、非同期関数式とまったく同じです。
リーリー
アロー関数は、ES2015 (ES6) で導入された関数を定義するための迅速かつ短い方法です。これらは、常に匿名であること、this
アロー関数は、の値が常に字句的に束縛されること、つまり外部スコープから継承されることを除いて、ほとんどの点で関数式と同等です。
async
関数コンストラクター関数が常に Promise を返し、
awaitを使用できる点を除いて、非同期アロー関数とまったく同じです。 (各非同期関数内に複数のステートメントがあるため、上記のステートメントとは若干異なります。つまり、これらのステートメントはブロック
{}と
returnに含める必要があります。これは、1 つのステートメントよりも長い通常のアロー関数にも当てはまります。)
リーリー
関数コンストラクターを使用すると、文字列を使用して関数を動的に定義できます。これらは常にグローバル スコープで実行され、定義されているスコープにはアクセスできないことに注意してください。これらはまれな状況でのみ役に立ちます。個人的には、非同期関数コンストラクターは役に立たないと思います。 AsyncFunction はグローバル オブジェクトではなく、最初に
関数コンストラクターを使用して作成された関数は、
asyncconst AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
を使用して取得する必要があるため、ES2017 の作者も私に同意しています。関数が常に Promise を返し、
await
を使用できることを除いて、匿名関数コンストラクターを使用して作成された関数とまったく同じです。 (でも、もうお分かりでしょう?)