概要
javascriptの言語の特徴の一つとして、関数を変数やオブジェクトのプロパティへ代入して値として使用する方法があります。
詳しい言語仕様については仕様書を確認するとして、ここでは実際にコードを書いて動作を見てみます。
まず、次のコードです。
//関数を定義 function test1(val1) { return val1 * 2; } //通常の関数呼び出し console.log(test1(10)); //20
出力結果
20
出力結果は「20」になりました。
これはオーソドックスな関数の定義と呼び出し方法です。
では次に、上記のtest1という関数を、オブジェクトのプロパティとして利用してみます。
具体的には次のようなコードを書きます。
//関数を定義 function test1(val1) { return val1 * 2; } //関数を一度、変数に代入してみる let tmp_func1 = test1; console.log(tmp_func1(30)); //60 console.log(tmp_func1(40)); //80
出力結果
60 80
この場合は、関数を一度変数に代入し、その変数に対して引数を指定し、関数を実行しています。
見た感じでは、通常の関数を実行しているように見えます。
では、次に関数をオブジェクトのプロパティとして指定する方法を試してみます。
具体的には、次のようなコードを書きます。
//関数をオブジェクトのプロパティとして代入する let test_obj = { test2: function(val2) { return val2 * 3; } }; console.log(test_obj.test2(5)); //15
出力結果
15
出力結果は「15」になりました。
この場合は、test_obj内に定義されたメソッドtest2に対して、関数を割り当てています。
次に、変数の引数の値として、関数を指定する方法についてです。
//配列の要素に、関数を格納する let test_arr = [function(val3) { return val3 * 8; }]; //40 console.log(test_arr[0](5)); //引数の2つ目は何もないので「TypeError: test_arr[1] is not a function」 console.log(test_arr[1](5));
出力結果
40 TypeError: test_arr[1] is not a function
二つ目の出力結果は、「TypeError: test_arr[1] is not a function」となります。
これは配列の二つ目の要素には何も指定していない為です。
関数を定義しているのは配列の1つ目であることに注意します。