JavaScript - 関数式と無名関数

関数式と無名関数

一般的に関数を定義するためには関数の宣言を行います。しかし、JavaScript では識別子 (関数名) を指定しない無名関数 (匿名関数) という形式があります。

識別子のない関数を呼び出すには関数式 (functionexpression) を使います。式は結果として値を返すもので、関数式は値として関数を返すものです。関数式は値を返すので、それを変数などに代入することもできますが、すぐに呼び出すこともできます。

関数式は、構文的に関数名を省略する以外は関数宣言とまったく同じです。以下の例では関数式を使って、その値を変数に代入しています。この変数を使って関数を呼び出すことができるので、実質的な効果としては関数宣言と変わりません。識別子 f を使って f() でこの関数を呼び出すことができます。

const f = function() {
    // ...
};
関数式と無名関数

無名関数は他の関数の引数として、あるいはオブジェクトのプロパティとして非常によく使われます。上記の関数式では関数名を省略しましたが、以下の例のように関数名を指定した上で関数式の値を変数に代入した場合はどうなるのでしょうか。

const g = function f() {
    // ...
}
関数式と無名関数

このように関数を作成した場合 g の方がが優先されます。関数の外で f を使ってこの関数を利用しようとすると f が定義されていないというエラーになります。

const g = function f(stop) { 
    if(stop) {
        console.log('f停止');
        return;
    }
    else {
        console.log('fは停止していない');
        f(true);
    }
};

g(false);
console.log("----");
g(true);

/* 実行結果
fは停止していない
f停止
----
f停止
*/
関数式と無名関数

関数の中では f でこの関数を参照し、外からは g でこの関数を参照しています。

関数宣言と関数式はよく似ていますが、コンテキスト (周囲の状況) によって区別されます。関数宣言が式として使われれば関数式となり、そうでない場合は関数宣言となります。

両者の区別は実質的にはほとんどありません。あとで呼び出す予定で名前付きの関数を定義するのならば関数定義、関数を作って何かに代入したり他の関数に渡したりするのならば関数式を使います。

関連記事

JavaScript のまとめページはプログラミング JavaScript 入門を参照してください。

Category:
プログラミング
公開日:
更新日:
Pageviews:
170
Shares:
1
Tag:
JavaScript