JavaScript | アロー関数

JavaScript JavaScript
スポンサーリンク

1. アロー関数って何?(ざっくり)

アロー関数は、function キーワードを使った従来の関数定義を短く・読みやすく書ける新しい書き方です。変数に関数を代入する「関数式」の一種で、=>(矢印)を使います。基本は次の形です。

let 関数名 = (引数1, 引数2) => {
  // 処理
  return 戻り値;
};
JavaScript

2. 書き方のルールと省略できるところ(実例で理解)

A. 引数が0個

let sayHi = () => {
  console.log("Hi!");
};
sayHi(); // Hi!
JavaScript

B. 引数が1個 → 括弧を省略できる

let double = x => {
  return x * 2;
};
console.log(double(5)); // 10
JavaScript

C. 処理が return だけのとき → {}return を省略できる(さらに短く)

let add = (a, b) => a + b;
console.log(add(3,4)); // 7
JavaScript

D. オブジェクトを「省略形で」返すときの注意
省略形(=> 値)でオブジェクトリテラルを返す場合、そのまま {} を書くと関数のブロックと誤解されます。オブジェクトを返したいときは丸括弧で囲います。

// NG(ブロックとみなされる)
let toObjNG = (n) => { value: n };

// OK(オブジェクトを返す)
let toObj = (n) => ({ value: n });
console.log(toObj(5)); // { value: 5 }
JavaScript

3. アロー関数で気をつける「仕組みの違い」 — 初心者がハマりやすい点

アロー関数は「見た目は短いが、普通の関数と違う振る舞い」がいくつかあります。これを知らないとバグになります。重要な点を分かりやすくまとめます:

  1. 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);
JavaScript
  1. this の扱いが違う(重要)
    アロー関数は自分専用の this を持ちません。定義された場所の this をそのまま使う(レキシカルに継承する) ので、オブジェクトのメソッドとして this を使いたい時や bind/call/applythis を変えたいときは注意が必要です。例えば、クラスやオブジェクトのメソッドにアロー関数を使うと期待した this(そのオブジェクト自身)にならないことがあります。詳しい挙動は MDN の解説が分かりやすいです。
const obj = {
  count: 0,
  // NG: arrow は外側の this を使うため obj を this にできない
  inc: () => { this.count++; }
};

obj.inc();
console.log(obj.count); // 0  → 意図した増加にならない
JavaScript
  1. コンストラクタ(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]
JavaScript

7. 最後に — 覚えておきたい短いまとめ

  • アロー関数は短く書けるが、thisargumentsnew の挙動が従来の関数と違う。使いどころを理解して使うことが大事です。

タイトルとURLをコピーしました