先に結論 awaitが使われている関数はジェネレータとして内部的に変換され、非同期処理になる。 その為、async関数である必要がある。 コンパイラから見ても、asyncが付いていることで効率的にコンパイルできる。 (追記 2021/07/21)最上位でのawaitは、もうすぐ可能になるかもしれない(一部ブラウザは実装済)。(鶏(async)が先か卵(await)が先かでコメントで教えて頂きました。感謝!) というわけで本編 awaitはPromiseを返す関数を呼び出す方法として非常に便利ですが、それを使う箇所にはいちいちasyncを付けて回らなければならないのが面倒だと思ったことはないでしょうか。 そもそもawaitを内部で使っている関数が常にasyncである必要性がいまいちピンと来ない方もいるのではないでしょうか(最初にasync/awaitの構文を見た時、私自身がそうでした)。 例