2015年に発表されたJavaScriptの新仕様ES6から、関数を定義する方法としてアロー関数というものが登場しました。モダンな書き方としては、従来のfunction()よりもアロー関数を利用したほうが望ましいとされています。
この記事では、function()とアロー関数の違いと、アロー関数のメリットについて書いていきます。
目次
アロー関数とは
function hoge(arg) { console.log(arg); } const hoge = (arg) => { console.log(arg); } どちらも引数argを受け取って出力する
上は従来のfunction()で、下はアロー関数です。アロー関数ではアロー(=>)を使っているのが特徴ですね。どちらも引数argを受け取って、そのまま出力しています。
function()とアロー関数の大きな違い
上を見ると、別にfunction()でもアロー関数でも良いじゃん!と思うかもしれませんが、実はthisの取り扱いで違いがあります。
一言でいえば、関数内におけるthisが固定されるか、されないかの違いです。
function()のthis
this.text = 'aaa'; function hoge() { console.log(this.text); } const obj = { text : 'bbb', func : hoge, }; const obj_2 = { text : 'ccc', func : hoge, }; obj.func(); // => 'bbb' obj_2.func(); // => 'ccc'
function()がオブジェクトのメソッドとして呼び出された場合、thisはオブジェクト自身へのポインタとなります。そのため、例えばobj内の関数hoge()にあるthis.textは、obj内のtext、つまりbbbに該当します。
これは言い換えると、関数hoge()が出力する内容は、どのオブジェクトのhoge()か?によって都度変わってしまうということです。これが予期しないバグを生み出す可能性があります。
アロー関数のthis
this.text = 'aaa'; const hoge = () => { console.log(this.text); } const obj = { text : 'bbb', func : hoge, }; const obj_2 = { text : 'ccc', func : hoge, }; obj.func(); // => 'aaa' obj_2.func(); // => 'aaa'
逆にアロー関数を利用した場合。どちらも出力はaaaになります。アロー関数の場合、関数が定義された時点でthisがグローバルに定義されたthis.text、つまりaaaに固定されます。
そのため、どのオブジェクトからhoge()を呼び出しても同じaaaが出力されるので、思わぬバグを生み出すリスクがより低くなるのです。