JavaScript アロー関数(Arrow Function)

Arrow functionsはES6で導入されました。

Arrow functionsを使うと、より短い関数構文を記述できます:


let myFunction = (a, b) => a * b;

Arrow Functionの導入前:


hello = function() {
  return "Hello World!";
}

Arrow Functionを使った場合:


hello = () => {
  return "Hello World!";
}

もっと短くなりました!関数が単一のステートメントで、そのステートメントが値を返す場合、中括弧とreturnキーワードを省略できます:

Arrow Functionはデフォルトで値を返します:


hello = () => "Hello World!";

Note: この省略形は、関数が単一のステートメントの場合にのみ有効です。

パラメータがある場合は、それらを括弧内に渡します:

パラメータを持つArrow Function:


hello = (val) => "Hello " + val;

実際、パラメータが1つしかない場合は括弧を省略することもできます:

括弧なしのArrow Function:


hello = val => "Hello " + val;

thisはどうなる?

Arrow Functionでは、通常の関数と比較してthisの扱いが異なります。

簡単に言うと、Arrow Functionではthisのバインディングがありません。

通常の関数では、thisキーワードは関数を呼び出したオブジェクトを表しました。それはウィンドウ、ドキュメント、ボタンなどでした。

しかしArrow Functionでは、thisキーワードは常にArrow Functionを定義したオブジェクトを指します。

この違いを理解するために、2つの例を見てみましょう。

両方の例では、ページの読み込み時に1回、ボタンのクリック時にもう1回メソッドを呼び出します。

最初の例では通常の関数を使用し、2番目の例ではArrow Functionを使用します。

結果は、最初の例が異なる2つのオブジェクト(ウィンドウとボタン)を返し、2番目の例が2回ともウィンドウオブジェクトを返すことを示しています。これは、ウィンドウオブジェクトが関数の「所有者」であるためです。

通常の関数を使った場合、thisは関数を呼び出したオブジェクトを表します:


// 通常の関数:
hello = function() {
  document.getElementById("demo").innerHTML += this;
}

// ウィンドウオブジェクトが関数を呼び出します:
window.addEventListener("load", hello);

// ボタンオブジェクトが関数を呼び出します:
document.getElementById("btn").addEventListener("click", hello);

Arrow Functionを使った場合、thisは関数を定義したオブジェクトを表します:


// Arrow Function:
hello = () => {
  document.getElementById("demo").innerHTML += this;
}

// ウィンドウオブジェクトが関数を呼び出します:
window.addEventListener("load", hello);

// ボタンオブジェクトが関数を呼び出します:
document.getElementById("btn").addEventListener("click", hello);

関数を扱う際にはこれらの違いを覚えておいてください。通常の関数の挙動が必要な場合もありますが、そうでない場合はArrow Functionを使用してください。