無名関数
無名関数
イベントの節で、関数も値の 一種であることを説明しました。このため、関数は変数やプロパティに代入したり、関数の引数や戻り値になったりできます。
しかしながら、通常の記法で関数を記述することが煩わしい場合があります。イベントハンドラを登録する場合を考えてみましょう。
<button id="greet-button">Click me</button>
function onGreetButtonClick() {
alert("こんにちは!"); // ダイアログボックスを表示
}
document.getElementById("greet-button").onclick = onGreetButtonClick;
この場合、関数onGreetButtonClick
は、イベントハンドラとして登録されるためだけに利用されており、onGreetButtonClick
という名前自体はあまり重要ではありません。こういった場合、関数オブジェクトの生成をするための式(関数式)を用いることができます。このようにして生成された関数は、名前を持たないため、無名関数と呼ばれます。
先ほどのプログラムを関数式を用いて書き換えると、次のようになります。
document.getElementById("greet-button").onclick = () => {
alert("こんにちは!");
};
JavaScriptにおける関数式の構文は、次のとおりです。=>
の記号が特徴的な構文となっています。
(引数1, 引数2) => {
処理;
}
通常の関数定義の構文は、ほとんど関数式を使用して書き換えることができます。次のプログラムにおいて、add1
とadd2
はほとんど等価なものとみなすことができます。
function add1(a, b) {
return a + b;
}
const add2 = (a, b) => {
return a + b;
};
この項で扱った無名関数式を、=>
記号が矢のように見えることから、アロー関数と呼ぶことがあります。JavaScriptには、アロー関数の他にもう一つ、無名関数を記述する方法があります。
const add3 = function (a, b) {
return a + b;
};
古い文献ではこちらの記法が採用されている場合がありますが、現代ではほとんど用いられません。
無名関数を用いると便利な関数
Array#map
メソッドは、引数として関数をひとつとり、配列の各要素に適用した上で、その戻り値からなる新しい配列を返します。
このように、他の関数の引数として呼び出される関数のことをコールバック関数と呼びます。
const pricesWithoutTax = [100, 200, 300, 400, 500];
const taxRate = 0.2;
const pricesWithTax = pricesWithoutTax.map((price) => {
return price * (1 + taxRate);
});
document.write(pricesWithTax); // 120,240,360,480,600
アロー関数の省略形
アロー関数は、内部の処理がreturn
文のみの場合、波括弧とreturn
キーワードを省略して式のみを記述することもできます。前項のサンプルプログラムは、次のように省略可能です。
const pricesWithTax = pricesWithoutTax.map((price) => price * (1 + taxRate));