JavaScriptでアロー関数を使った即時関数
(IIFE: Immediately Invoked Function Expression)を書くときに、
javascript(() => {
console.log("Hello!");
})();
のように「アロー関数を小括弧で括り、さらにその後に小括弧を付ける」
書き方がされる理由について説明します。
🔹 この記法の意味と目的
この構文には2つの重要な意味があります:
① 小括弧で関数を「式」として扱うため
JavaScriptでは、関数宣言と関数式を明確に区別します。
javascript() => {} // ← これは構文的に文(statement)としては不完全
通常、JavaScriptの構文解析器(パーサ)は、何もない状態で () => {}
のような記述を見ると、文としては解釈できません。
でも小括弧で括ると:
javascript(() => { ... })
→ これは「関数式」とみなされ、JavaScriptは正しく解釈できます。
② 末尾の () で即時実行する
小括弧で式として定義したアロー関数に対して、すぐ () を付けることで、
その場で実行できます:
javascript(() => {
console.log("即時実行される!");
})();
✅ まとめると
javascript(() => { ... })()
この記法は:
(() => { ... })でアロー関数を関数式として定義()でその関数を即時実行
という流れです。
💡補足:普通の関数との違い
アロー関数じゃなくても同じように即時関数を書けます:
javascript(function() {
console.log("これも即時関数!");
})();
関数宣言は即時実行できないので、小括弧を使って関数「式」に変える
必要がある点は共通です。
Javascriptのコードは、文と式で構成されます。
なので、必ずどちらかに属している事を示す、記述をしなければなりません。
そうしないと構文解析器(パーサ)が判断できないからです。
JavaScriptにおける「文(statement)」と「式(expression)」の違いは、
理解しておくとコードの構造やエラーの原因がすごくわかりやすくなります。
🌱 文(Statement)と式(Expression)の違い
🔹 式(Expression)とは?
**「値を生成するもの」**です。
一言で言えば「何かの値になるもの」です。
たとえば:
javascript1 + 2 // → 3
"hello" // → "hello"
x * 5 // → 値になる
()=>{} // → 関数オブジェクト(値)
これらはすべて式(expression)です。
式はどこでも値として使える(変数に代入したり、関数に渡したり)
という特徴があります。
🔹 文(Statement)とは?
**「処理の単位」や「命令」**です。
「こうしなさい!」という命令的な構文。
例:
javascriptlet x = 10; // 変数宣言文
if (x > 5) { ... } // if 文
for (let i = 0; i < 5; i++) { ... } // for 文
console.log("Hello"); // 式文(後述)
文は、プログラムの制御を行うための命令で、
文自体は値を返さないものが多いです
(ある意味、「値にならない」)。
また、文は式を含みますが、式は文を含みません。
⚡ 「式文(Expression Statement)」ってなに?
面白いのは、**「式だけど、それを1つの文として書いているもの」**
もあるということ。
これを 式文(expression statement)と呼びます。
たとえば:
javascriptx + 1; // これ自体は式だけど、セミコロンがついてて文になってる → 式文
console.log(x); // 関数呼び出し(式)+ セミコロン → 式文
Javascriptのコードは、
”文を幾つか記述し、その中に幾つかの式が存在するというコード”
となります。
式を単独で記述するというコードは、あまり意味を持ちません。
なので、
”式を作って、それを文にあてはめる作業がプログラム”
だと考えて
コードを記述すると、コードの記述が簡単になるかもしれません。
🔥 なぜこの違いが大事なの?
1. 構文エラーになることがある
javascript()=>{}(); // ❌ エラー(文として解釈できない)
(() => {})(); // ✅ OK(式として明示)
これが、アロー関数の即時実行にカッコが必要な理由です。
文として直接アロー関数を書くと文法的に不正だから。
()=>{}は式なので、何かの実行結果値を()で即実行は、
”値(実行結果)を実行する”って変なので、
()で括って式を明確にして、()で即実行とします。
2. 式は値として扱える
たとえば関数の中で条件によって違う関数を返したいとき:
javascriptconst getFunc = (flag) => flag ? () => "A" : () => "B";
これ、三項演算子の中でアロー関数(式)を使ってるんですね。
文だったらこれは書けません。
🧠 まとめ:式 vs 文
| 観点 | 式(Expression) | 文(Statement) |
|---|---|---|
| 定義 | 値を返すもの | 命令・処理の単位 |
| 例 | 1 + 2, "abc", () => {} | if, for, let, return |
| 単独で書ける? | 式だけだと意味がないことも | 単独で書くことが多い |
| 値になる? | ✅ 値になる | ❌ 値にならない(ことが多い) |


