1. アロー関数って何?(ざっくり)
アロー関数は、function キーワードを使った従来の関数定義を短く・読みやすく書ける新しい書き方です。変数に関数を代入する「関数式」の一種で、=>(矢印)を使います。基本は次の形です。
let 関数名 = (引数1, 引数2) => {
// 処理
return 戻り値;
};
JavaScript2. 書き方のルールと省略できるところ(実例で理解)
A. 引数が0個
let sayHi = () => {
console.log("Hi!");
};
sayHi(); // Hi!
JavaScriptB. 引数が1個 → 括弧を省略できる
let double = x => {
return x * 2;
};
console.log(double(5)); // 10
JavaScriptC. 処理が return だけのとき → {} と return を省略できる(さらに短く)
let add = (a, b) => a + b;
console.log(add(3,4)); // 7
JavaScriptD. オブジェクトを「省略形で」返すときの注意
省略形(=> 値)でオブジェクトリテラルを返す場合、そのまま {} を書くと関数のブロックと誤解されます。オブジェクトを返したいときは丸括弧で囲います。
// NG(ブロックとみなされる)
let toObjNG = (n) => { value: n };
// OK(オブジェクトを返す)
let toObj = (n) => ({ value: n });
console.log(toObj(5)); // { value: 5 }
JavaScript3. アロー関数で気をつける「仕組みの違い」 — 初心者がハマりやすい点
アロー関数は「見た目は短いが、普通の関数と違う振る舞い」がいくつかあります。これを知らないとバグになります。重要な点を分かりやすくまとめます:
argumentsが使えない
アロー関数の内部ではargumentsオブジェクトが参照できません(ReferenceErrorになります)。可変長の引数がほしいときは rest パラメータ(...args) を使いましょう。
// NG (ReferenceError)
let f = () => {
console.log(arguments);
};
f(1,2,3);
// OK (rest を使う)
let g = (...args) => {
console.log(args); // [1,2,3]
};
g(1,2,3);
JavaScriptthisの扱いが違う(重要)
アロー関数は自分専用のthisを持ちません。定義された場所のthisをそのまま使う(レキシカルに継承する) ので、オブジェクトのメソッドとしてthisを使いたい時やbind/call/applyでthisを変えたいときは注意が必要です。例えば、クラスやオブジェクトのメソッドにアロー関数を使うと期待したthis(そのオブジェクト自身)にならないことがあります。詳しい挙動は MDN の解説が分かりやすいです。
const obj = {
count: 0,
// NG: arrow は外側の this を使うため obj を this にできない
inc: () => { this.count++; }
};
obj.inc();
console.log(obj.count); // 0 → 意図した増加にならない
JavaScript- コンストラクタ(
new)として使えない
通常の関数はnewを使ってオブジェクト生成(コンストラクタ)にできますが、アロー関数はコンストラクタになれません。newで呼ぶとエラーになります。必要なら従来のfunctionを使いましょう。
4. どんな場面でアロー関数を使うと良い?/避けた方がいい?(実用的アドバイス)
使うと良い場面:
- コールバック(
map,filter,forEachなど)で短く書きたいとき。 - 一時的に関数を渡すだけで、
thisを使わない処理のとき。
避けた方が良い場面:
- オブジェクトのメソッドで
thisを使う必要がある場合。 - その関数を
newでインスタンス化したい場合(コンストラクタにしたい場合)。 argumentsを直接使いたい古いコードをそのまま書き換えるとき(rest を使えば対応可能)。
5. 例題(手を動かしてみよう)
例題1 — 足し算(基本)
let sum = (a, b) => a + b;
console.log(sum(2, 3)); // 5
JavaScript説明:引数2つで結果を返すだけなので省略形で一行にできます。
例題2 — 可変個数の合計(rest を使う)
let total = (...nums) => {
return nums.reduce((s, v) => s + v, 0);
};
console.log(total(1,2,3,4)); // 10
JavaScript説明:arguments は使えないので ...nums で受け取り reduce で合計しています。
例題3 — オブジェクトを返す(丸括弧の必須例)
let makeUser = (name, age) => ({ name: name, age: age });
console.log(makeUser("Mika", 30)); // { name: "Mika", age: 30 }
JavaScript説明:省略形でオブジェクトを返すときは ({...}) の形にするのを忘れないでください。
例題4 — this を使ったメソッド(NG例とOK例)
const counter = {
value: 0,
// NG: arrow を使うと this が期待と違う(外側の this を参照してしまう)
badInc: () => { this.value++; },
// OK: 通常の関数式を使う(またはメソッド短縮記法)
goodInc() { this.value++; }
};
counter.goodInc();
console.log(counter.value); // 1
JavaScript説明:オブジェクトのメソッドは通常の関数(メソッド)で書くのが安全です。 (MDN Web Docs)
6. 練習問題 — 解答付き
問題A:square という名前のアロー関数を作り、引数 n の2乗を返してください。
解答A:
let square = n => n * n;
console.log(square(4)); // 16
JavaScript問題B:任意個の引数を受け取り、最大値を返すアロー関数 maxValue を作ってください。ヒント:Math.max と ... を使う。
解答B:
let maxValue = (...nums) => Math.max(...nums);
console.log(maxValue(3, 7, 2, 9)); // 9
JavaScript問題C:配列 [1,2,3,4] を map とアロー関数を使って各要素を2倍にしてください。
解答C:
let arr = [1,2,3,4];
let doubled = arr.map(x => x * 2);
console.log(doubled); // [2,4,6,8]
JavaScript7. 最後に — 覚えておきたい短いまとめ
- アロー関数は短く書けるが、
thisやarguments、newの挙動が従来の関数と違う。使いどころを理解して使うことが大事です。
