関数は変数に代入できる 【プログラミング発展】
多くの言語で、関数本体そのものを変数に代入して扱うことができます。ここではその方法や挙動を見ていきましょう。
代入
Javascriptの場合の関数の代入を紹介します。
function f(v) { return v * 2; } const vf = f; console.log(vf(5));
10
今まで、f(10)
などとして関数を呼び出してきましたが、()
は実は演算子の一つです。この演算子を使わない場合、関数の計算結果はではなく、関数本体が計算結果として代入されます。
分解すると、f
は関数という型の値です. ()
という演算子は、関数という型の値に対し、関数の中身を実行するものです。
代入されたvf
は、f
の関数の本体が代入されています。そのため、()
を使って関数を呼び出すことができます。
配列に入れる
上のことを踏まえると、配列や連想配列に関数を入れるといったことが可能です。
const results = { win: () => { console.log("WIN!!"); }, draw: () => { console.log("DRAW"); }, lose: () => { console.log("LOSE..."); } } // ... results["win"](); results["draw"](); results["lose"]();
WIN!! DRAW LOSE...
Javascriptのアロー関数を使用しています。詳しくはJavascriptの関数の章を見てください。
このように、direction["win"]
などには関数の本体が入っています。今まで通り[]
で連想配列の要素を取得したら、()
で関数を呼び出します。
C++など、言語によって書き方に少し差があるので、関数の代入などはそれぞれの言語の仕様を確認してください。
関数の戻り値に関数
これまでのことを踏まえると、関数の戻り値に関数を置くことが可能です。
function f() { return (v) => { console.log(v); } } const a = f(); a(10); f()("foo");
10 foo
return
の値として関数が来ていますね。f()
の計算結果が関数本体ということになります。
f()("foo")
では、f()
の戻り値である関数を、()
を使って呼び出しているという構成です。
関数を受け取ったり返したりする関数を、高階関数と呼びます。
まとめ
関数の本体も値の一つであり、変数に代入できることを紹介しました。クロージャやコールバックはこの使い方の典型例です。
関数の扱いは奥深いので、ぜひマスターしてください!