【JavaScript入門】即時実行関数 (async () => {})() はいつ実行されるのか?

1. はじめに

JavaScript を学習していると、以下のようなコードを見かけることがあります。

(async () => {
    console.log("実行された");
})();

この (async () => {})() は「即時実行関数(IIFE: Immediately Invoked Function Expression)」の一種です。
しかし「非同期関数(async function)」と組み合わせた場合、いつ実行されるのか? という疑問を持つ方が多いでしょう。

本記事では、(async () => {})()どのタイミングで実行されるのか を解説


2. 即時実行関数(IIFE)とは?

通常の関数は定義しただけでは実行されません。

function test() {
    console.log("Hello");
}
test(); // ← 呼び出しが必要

一方、即時実行関数は「定義と同時に実行される」特殊な書き方です。

(() => {
    console.log("Hello");
})(); // ← 定義と同時に呼び出し

これにより グローバル変数の汚染を避けつつ、すぐに処理を開始 できます。


3. 非同期版即時実行関数 (async () => {})()

非同期処理を使いたい場合、以下のように async を付けて書きます。

(async () => {
    const data = await fetch("https://example.com/data.json");
    console.log(await data.json());
})();

ポイントは以下の通りです:

  • async をつけることで await が使える
  • 戻り値は Promiseオブジェクト になる
  • 定義した瞬間に即実行される

4. 実行タイミングはいつ?

結論から言うと、スクリプトが実行された瞬間に即時実行される という点は通常の IIFE と変わりません。

ただし、HTML 内のどこにスクリプトを書いたかで挙動が変わります。

(1) <head> 内に記述した場合

<head>
<script>
(async () => {
    console.log("head内で実行される");
})();
</script>
</head>

➡ ページの DOM 構築前に実行されます。


(2) <body> の末尾に記述した場合

<body>
    <p>本文</p>
<script>
(async () => {
    console.log("DOM構築後に実行される");
})();
</script>
</body>

➡ DOM が構築された後に実行されるため、要素操作に便利です。


(3) <script defer> を使った場合

<script defer>
(async () => {
    console.log("defer後に実行される");
})();
</script>

➡ DOM の構築完了後に実行されます。


5. await の処理タイミング

関数自体は スクリプト読み込み時に即実行 されますが、await を使った部分は 非同期処理の完了を待って再開 します。

つまり:

(async () => {
    console.log("開始");
    await new Promise(r => setTimeout(r, 1000));
    console.log("1秒後に実行");
})();

実行結果は次のようになります。

開始
(1秒待機)
1秒後に実行

6. まとめ

  • (async () => {})()非同期即時実行関数
  • 実行タイミングは スクリプトが読み込まれた瞬間
  • HTML のどこに書くか、defer / async を使うかでタイミングが変わる
  • await 部分は 非同期処理の完了後に続きが実行される

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA