JavaScript | 基礎構文:関数 – アロー関数

JavaScript JavaScript
スポンサーリンク

アロー関数って何者?

アロー関数は、
「関数をもっと短く・スッキリ書くための新しい記法」 です。

見た目はこういうやつです。

const greet = (name) => {
  console.log("こんにちは、" + name + "さん");
};
JavaScript

function の代わりに =>(矢印)を使うので「アロー(矢印)関数」と呼ばれます。
本質的には「関数式」の一種で、書き方がコンパクトになったものだと思ってください。


まずは「普通の関数」との対応関係をつかむ

function との書き換え対応

一番大事なのは、
「普通の関数(function)」と「アロー関数」がどう対応しているかを、
頭の中で変換できるようになることです。

例えば、これが普通の関数式。

const add = function (a, b) {
  return a + b;
};
JavaScript

これをアロー関数で書くとこうなります。

const add = (a, b) => {
  return a + b;
};
JavaScript

function が消えて、
引数のあとに => がついているだけです。

もう一つ。

const greet = function (name) {
  console.log("こんにちは、" + name + "さん");
};
JavaScript

アロー関数だとこう。

const greet = (name) => {
  console.log("こんにちは、" + name + "さん");
};
JavaScript

ここが重要です。
アロー関数は「まったく別物」ではなく、
「function を使った関数式を、短く書くための記法」だと捉えると怖くなくなります。


アロー関数の「省略ルール」をちゃんと理解する

引数が1つのときのカッコ省略

引数が1つだけなら、カッコを省略できます。

const greet = name => {
  console.log("こんにちは、" + name + "さん");
};
JavaScript

もちろん、カッコをつけてもOKです。

const greet = (name) => {
  console.log("こんにちは、" + name + "さん");
};
JavaScript

どちらも同じ意味です。
複数あるときは必ずカッコが必要です。

const add = (a, b) => {
  return a + b;
};
JavaScript

引数が0個のときは必ず () が必要

引数がない場合は、こう書きます。

const sayHello = () => {
  console.log("こんにちは");
};
JavaScript

「1行で値を返すだけ」のときは return と波カッコを省略できる

アロー関数の一番気持ちいいところがここです。

例えば、これ。

const double = function (n) {
  return n * 2;
};
JavaScript

アロー関数で、しかも「1行で値を返すだけ」なら、こう書けます。

const double = (n) => n * 2;
JavaScript

波カッコ {}return も消えています。
=> の右側の式の結果が、そのまま戻り値になる」というルールです。

もう少し例を。

const add = (a, b) => a + b;

const toUpper = (str) => str.toUpperCase();
JavaScript

ここが重要です。
「1行で“値を返すだけ”なら、{}return を省略できる」
このルールを覚えると、アロー関数が一気に気持ちよく使えるようになります。


実例:配列メソッドとアロー関数の相性の良さ

map とアロー関数

配列の map とアロー関数は、ほぼセットで使われます。

例えば、配列の各要素を2倍にしたいとします。

普通の関数式だとこう。

const numbers = [1, 2, 3];

const doubled = numbers.map(function (n) {
  return n * 2;
});

console.log(doubled); // [2, 4, 6]
JavaScript

アロー関数だとこう。

const numbers = [1, 2, 3];

const doubled = numbers.map((n) => n * 2);

console.log(doubled); // [2, 4, 6]
JavaScript

かなりスッキリしましたよね。
n を受け取って n * 2 を返す関数」を、その場で書いて渡しているだけです。

filter とアロー関数

条件に合うものだけを残す filter もよく使います。

const numbers = [1, 2, 3, 4, 5];

const even = numbers.filter((n) => n % 2 === 0);

console.log(even); // [2, 4]
JavaScript

n を受け取って、n % 2 === 0 という真偽値を返す関数」です。
filter は「true を返した要素だけ残す」ので、偶数だけが残ります。

forEach とアロー関数

単に「全部に対して何かしたい」だけなら forEach

const numbers = [1, 2, 3];

numbers.forEach((n) => {
  console.log("数値:", n);
});
JavaScript

ここが重要です。
アロー関数は「その場でちょっとした処理を書いて渡す」場面で、
圧倒的に読みやすくなる。
配列メソッドとの組み合わせは、実務でも頻出パターンです。


アロー関数と普通の関数の「本質的な違い」

ここから少しだけ深い話をします。
アロー関数は「短く書ける」だけではなく、
thisarguments の扱いが普通の関数と違う という特徴があります。

初心者のうちは「細かいことはあとで」でいいですが、
「違いがある」ということだけは知っておいてほしいです。

this が「外側の this を引き継ぐ」

普通の関数は、呼び出し方によって this が変わります。

アロー関数は、
「自分自身では this を持たず、外側の this をそのまま使う」
という性質があります。

例えば、DOM イベントでよくあるパターン。

button.addEventListener("click", function () {
  console.log(this); // ここでは this は button 要素
});
JavaScript

これをアロー関数にすると。

button.addEventListener("click", () => {
  console.log(this); // ここでは「外側の this」になる(多くの場合 window など)
});
JavaScript

この違いは、クラスやオブジェクトのメソッドの中で特に効いてきます。

例えば、こういうコード。

const obj = {
  value: 42,
  showLater: function () {
    setTimeout(function () {
      console.log(this.value);
    }, 1000);
  },
};

obj.showLater();
JavaScript

この場合、setTimeout の中の functionthisobj ではありません。
なので this.valueundefined になります。

これをアロー関数にすると。

const obj = {
  value: 42,
  showLater: function () {
    setTimeout(() => {
      console.log(this.value);
    }, 1000);
  },
};

obj.showLater(); // 1秒後に 42 と表示される
JavaScript

アロー関数は「外側の this(ここでは obj)」をそのまま使うので、
this.value は 42 になります。

ここが重要です。
アロー関数は「this を固定したいとき」に便利。
逆に、「呼び出し方によって this が変わってほしいメソッド」には向きません。

コンストラクタには使えない

普通の関数は、new をつけてコンストラクタとして使えます。

function Person(name) {
  this.name = name;
}

const p = new Person("太郎");
JavaScript

アロー関数は、コンストラクタとしては使えません。

const Person = (name) => {
  this.name = name;
};

const p = new Person("太郎"); // エラー
JavaScript

アロー関数には [[Construct]] という内部仕様がなく、
new できないからです。

なので、
「クラスっぽいもの」「コンストラクタ関数」にはアロー関数を使わない
というルールを覚えておくと安全です。


どんなときにアロー関数を使うと気持ちいいか

「短い処理」「その場限りの処理」

例えば、イベントリスナー。

button.addEventListener("click", () => {
  console.log("クリックされました");
});
JavaScript

配列メソッド。

const names = users.map((user) => user.name);
JavaScript

Promise チェーン。

fetch("/api/users")
  .then((res) => res.json())
  .then((data) => {
    console.log(data);
  });
JavaScript

こういう「その場でちょっと書いて渡す」処理は、
アロー関数にすると読みやすくなります。

「this を外側と揃えたいとき」

さっきの setTimeout の例のように、
「外側の this をそのまま使いたい」場面では、
アロー関数がとても便利です。

クラスのメソッドの中で、
コールバックとして何かを渡すときなどが典型です。


初心者として「アロー関数」で本当に押さえてほしいこと

アロー関数は、
「function を短く書くための記法」+「this の扱いが少し特殊な関数」 です。

基本形はこれ。

const 関数名 = (引数1, 引数2, ...) => {
  // 処理
  return 結果; // 必要なら
};
JavaScript

1行で値を返すだけなら、こう書けます。

const add = (a, b) => a + b;
JavaScript

重要なポイントは、

「普通の関数式」と対応関係を頭の中で変換できるようにする
引数1つならカッコ省略可、0個なら () 必須
1行で値を返すだけなら {}return を省略できる
this が「外側の this を引き継ぐ」こと(ここは徐々に慣れればOK)
コンストラクタには使わない

まずは、
今まで function で書いていた「短い関数」から、
少しずつアロー関数に置き換えてみてください。

例えば、

[1, 2, 3].map(function (n) {
  return n * 2;
});
JavaScript

を、

[1, 2, 3].map((n) => n * 2);
JavaScript

に変えてみる。

この小さな一歩を何度か踏むうちに、
アロー関数は「難しい新機能」ではなく、
「自然に手が伸びる書き方」になっていきます。

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