Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2016年9月以降、すべてのブラウザーで利用可能です。
アロー関数式は、従来の関数式の簡潔な代替構文ですが、意味的な違いや意図的な使用上の制限もあります。
引数内での残余引数、デフォルト引数、構造分解には対応していますが、常に括弧が必要になります。
アロー関数は、 async にすることができます。この場合は式の前に async キーワードを付けます。
伝統的な無名関数を、最も単純なアロー関数に段階的に分解してみましょう。それぞれの段階も有効なアロー関数です。
メモ: 従来の関数式とアロー関数は、構文以外にも異なる点があります。次のいくつかの節で、その動作の違いを詳しく紹介します。
上の例では、引数を囲む括弧と関数本体を囲む中括弧の両方を省略することができます。ただし、省略できるのは特定の場合のみです。
括弧を省略できるのは、関数に単一の単純な引数がある場合だけです。複数の引数がある場合、引数がない場合、デフォルト引数、構造分解、残余引数がある場合は、引数リストを括弧で囲む必要があります。
中括弧を省略できるのは、関数が直接式を返す場合だけです。本体に文がある場合は中括弧が必要となります。この場合、返値を明示的に return キーワードで指定する必要があります。アロー関数はいつ何を返すかを推測することはできません。
アロー関数は、本質的に名前に関連付けられていません。アロー関数を自身で呼び出す必要がある場合は、代わりに名前付き関数式を使用してください。また、アロー関数を変数に代入し、その変数を通して参照することもできます。
アロー関数は、式本体 (expression body) か、もしくはより一般的なブロック本体 (block body) のどちらかを使用することができます。
式本体においては、単一の式しか記述できないので、その式が暗黙的に返値になります。 ブロック本体は従来の関数本体と同様であり、返値は return キーワードを用いて明示的に指定しなければなりません。アロー関数は値を返さなければならないわけではありません。ブロック本体の実行が return 文に遭遇することなく到達した場合、その関数は他の関数と同様に undefined を返します。 return される値となります。しかし、ブロック本体においては、明示的に return 文を使用する必要があります。
式本体 (params) => { object: literal } を使ってオブジェクトリテラルを返そうとしても、期待通りに動作しないことに注意しましょう。
これは、 JavaScript がアロー関数を式本体とみなすのは、アローに続くトークンが左中括弧でない場合のみであるため、中括弧 ({}) 内のコードは一連の文として解釈され、 foo はオブジェクトリテラルのキーではなく、ラベルとなります。
これを修正するには、オブジェクトリテラルを括弧で囲んでください。
アロー関数式は自分自身で this を持たないので、メソッドではない関数にのみ使用してください。メソッドとして使用しようとするとどうなるか見てみましょう。
Object.defineProperty() を使った他の例です。
クラスの本体は this コンテキストを持っているので、クラスフィールドのようなアロー関数はクラスの this コンテキストを閉じ、アロー関数の本体の中の this はインスタンス(または静的フィールドの場合はクラス自体)を正しく参照します。しかし、これは関数自身のバインディングではなく、クロージャであるため、 this の値が実行コンテキストによって変わることはありません。
アロー関数のプロパティはよく「自動バインドメソッド」と言いますが、これは通常のメソッドと同等だからです。
メモ: クラスフィールドはインスタンスで定義され、プロパティでは定義されていません。そのため、インスタンスを作成するたびに新しい関数参照が作成され、新しいクロージャが割り当てられます。これにより、通常の非バインドメソッドよりも多くのメモリーが使用される可能性があります。
同様の理由で、call()、apply()、bind() の各メソッドは、アロー関数で呼び出されても有益ではありません。アロー関数は、アロー関数が定義されているスコープに基づいて this の値を定義しており、関数の呼び出し方によってこの値が変わることはないからです。
アロー関数は自身の arguments オブジェクトを持ちません。そのため、この例では、 arguments は囲っているスコープでの同名変数への参照にすぎません。
多くの場合、残余引数が arguments オブジェクトの代わりに使えます。
アロー関数はコンストラクターとして使用することができず、 new を付けて呼び出されるとエラーが発生します。また、 prototype プロパティもありません。
yield キーワードはアロー関数内で使用できません(内部で入れ子になった関数が許可されている場合を除く)。結果として、アロー関数はジェネレーターとして使用できません。
アロー関数では、括弧とアロー(矢印)の間に改行を入れることができません。
しかし、矢印の後に改行を入れたり、以下のように括弧や中括弧を使用して、コードがきれいで滑らかになるように修正することができます。また、引数同士の間にも改行を入れることができます。
アロー関数のアロー(矢印)は演算子ではありませんが、アロー関数には特別な解釈ルールがあり、通常の関数とは演算子の優先順位の扱いが異なります。
=> はほとんどの演算子よりも優先順位が低いので、callback || () がアロー関数の引数リストとして解釈されるのを避けるために括弧が必要になります。
call、apply、bind は、従来の関数ではそれぞれのメソッドにスコープを確立するので、期待通りに動作します。
アロー関数では、 add 関数は基本的に window (グローバル) スコープで作成されているので、 this は window だと仮定されます。
おそらくアロー関数を使う最大の利点は、 DOM レベルのメソッド(setTimeout() や EventTarget.prototype.addEventListener())で、通常は何らかのクロージャ、call()、apply()、bind() を使用して、関数が適切なスコープで実行されることを確認する必要があることです。
従来の関数式では、このようなコードは期待通りに動作しません。
アロー関数を使えば、 this スコープをより簡単に保持することができます。
| ECMAScript® 2027 Language Specification # sec-arrow-function-definitions |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。