関数は変数に代入できる 【プログラミング発展】

多くの言語で、関数本体そのものを変数に代入して扱うことができます。ここではその方法や挙動を見ていきましょう。

代入

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()の戻り値である関数を、()を使って呼び出しているという構成です。

関数を受け取ったり返したりする関数を、高階関数と呼びます。

まとめ

関数の本体も値の一つであり、変数に代入できることを紹介しました。クロージャやコールバックはこの使い方の典型例です。

関数の扱いは奥深いので、ぜひマスターしてください!

function var

役に立ったらシェアしよう!