この記事の目次
アロー関数とは
アロー関数は、=> を使って関数を短く書ける記法で、ES2015で追加されました。コールバック関数を書く場面で特に重宝します。単なる省略記法ではなく、自分自身の this を持たない(外側の this を引き継ぐ)という性質があり、通常の function とは挙動が異なる点が重要です。
基本(構文・仕組み)
// 通常の関数式
const add1 = function (a, b) { return a + b; };
// アロー関数
const add2 = (a, b) => { return a + b; };
// 式が1つなら { } と return を省略できる
const add3 = (a, b) => a + b;
// 引数が1つなら () も省略できる
const sq = x => x * x;
// 引数なしは () が必要
const hello = () => 'hello';
| 項目 | function | アロー関数 |
|---|---|---|
| this | 呼び出し方で決まる | 定義された場所の this を引き継ぐ |
| arguments | 使える | 使えない(残余引数 ...args を使う) |
| new で呼ぶ | できる | できない |
| メソッド定義 | 向いている | 向かないことが多い |
サンプルコード(実行結果つき)
基本の書き方
const add = (a, b) => a + b;
console.log(add(2, 3)); // 5
const sq = x => x * x;
console.log(sq(4)); // 16
オブジェクトを返すときは丸括弧で包む
const mk = () => ({ id: 1 });
console.log(mk()); // { id: 1 }
const bad = () => { id: 1 };
console.log(bad()); // undefined
{ id: 1 } を { } だけで書くと、ブロックと解釈されてラベル付きの式になり、何も返りません。オブジェクトリテラルを返すときは ({ ... }) にします。
thisの違い
const obj = {
name: 'A',
reg() { return [1].map(function () { return this && this.name; }); },
arr() { return [1].map(() => this.name); }
};
console.log(obj.reg(), obj.arr()); // [ undefined ] [ 'A' ]
通常の関数のコールバックでは this が obj になりません。アロー関数は外側(arr メソッド)の this をそのまま使うため 'A' が取れます。
メソッドにアロー関数を使うと困る例
const o2 = { name: 'B', f: () => typeof this, g() { return this.name; } };
console.log(o2.f(), o2.g()); // object B
f のアロー関数の this は o2 ではなく外側のものです(Node.js の CommonJS ファイル直下では module.exports(空オブジェクト)、ブラウザの通常のスクリプトでは window です。ES Modules では undefined になり、typeof this は 'undefined' になるため、結果は環境で変わります)。o2.g() のように短縮メソッド記法を使えば this は o2 を指します。
newとargumentsの制限
try { new (() => {}); } catch (e) { console.log(e.name + ': ' + e.message); }
// TypeError: (intermediate value) is not a constructor
function h() { const inner = () => arguments[0]; return inner(99); }
console.log(h(7)); // 7(外側の関数の arguments を参照している)
動作確認(検証環境と結果)
- 環境: Node.js v24.19.0(Windows 11)
- 実行:
nodeで上記を実行し、5/16/{ id: 1 }/undefined/[ undefined ] [ 'A' ]/object B/TypeError: ... is not a constructor/7を確認 - 検証ログ:
C:Tempks2techtestsjs-arrow-function.md - ブラウザでの
this(window)の挙動は今回は未検証です。
アロー関数の注意点
- アロー関数は匿名になりがちで、スタックトレースが読みにくくなることがあります。変数に代入すれば名前が推論されます。
- オブジェクトのメソッドやイベントハンドラで
thisに要素やオブジェクト自身を期待する場合、アロー関数は不向きです。 call・apply・bindでthisを指定しても、アロー関数のthisは変わりません。
アロー関数でよくあるミス
- オブジェクトを返したいのに
() => { ... }と書いてundefinedになる。 - イベントリスナーで
thisを要素として使おうとして、アロー関数にして動かなくなる(event.currentTargetを使えば解決します)。 - コンストラクタやプロトタイプメソッドをアロー関数で書いてしまう。
- 複数行の本体で
returnを書き忘れる。
ブラウザ対応・バージョン
アロー関数は現行の主要ブラウザで利用できます。Internet Explorer は非対応です。対応バージョンは MDN の「ブラウザーの互換性」で最新を確認してください。
アロー関数のチェックリスト
- [ ] コールバックの
thisが外側を指してほしいときにアロー関数を使った - [ ] オブジェクトを返す式は
({ })で包んだ - [ ] メソッド・コンストラクタには通常の関数(または短縮記法)を使った
- [ ]
argumentsの代わりに...argsを使った
アロー関数のFAQ(よくある質問)
Q. 全部アロー関数で書いてよいですか?
A. トップレベルの関数宣言まで置き換える必要はありません。読みやすさを基準に、コールバックはアロー、メソッドや巻き上げが欲しい関数は function と使い分けるのが無難です。
Q. return は省略してよい?
A. 本体が1つの式なら省略できます。複数行になるなら { } と return を明示した方が読みやすいです。
Q. なぜ引数1つで括弧を省略できるのに、書く人が多いのですか?
A. 引数を増やすときの手直しが減る、型注釈を付けやすいなどの理由でチームの規約にすることがあります。好みの範囲です。
筆者の見解(アロー関数)
アロー関数の最大の利点は短さよりも、this を迷わず扱えることだと考えます。コールバックの中で const self = this; と書いていた時代に比べ、読みやすくなりました。ただし便利さゆえに全部をアロー関数にする書き方も見かけますが、メソッドまで置き換えると不具合の原因になりやすいので、私は用途で使い分けるのが良いと思います。
