さて、前回は「関数宣言」でした。
今回は「関数式」です。これは無名関数とか、無名関数式という呼ばれ方もします。
サンプルをみていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//[1] const plus1 = function(a, b) { return a + b; }; console.log(plus1(1, 2)); // 3 と表示される //[2] const plus2 = function plusXXX(a, b) { return a + b; }; console.log(plus2(2, 3)); // 5 と表示される //[3] console.log(plus3(3, 4)); // エラー const plus3 = function(a, b) { return a + b; }; |
[1]の内容は、plus1 という変数に 関数式 の内容を代入しています。そして、console.logの所で実行することで値を取得しています。変数に関数を代入するタイプのものが「関数式」です。これは「関数宣言」と、似てはいるけど、別物という扱いになるわけです。
「関数宣言」のページと比較して見比べてみておいてください。
[2]では [1] の機能とほとんど同じものを少し変えて書きました。plus2 という変数に plusXXX という名前の関数式を代入しています。
ここでは名前をつけて書いてみましたが、ほとんどの場合においてはこの[2]のような「関数式」に名前をつける、なんていうコードは書きません。関数式に名前をつけてもほとんどの場合は意味がないからです。function plusXXX のところを、別の名前の関数式に変えてみてもらっても、変数 plus2 に代入してしまえば、同じです。
「無名関数」とか「無名関数式」と呼ばれるものは、[1]の形式のものです。[2]は「名前あり関数式」となります。ただし[2]はほぼ使われません。[1]だけです。ということで、JavaScriptの場合は、無名関数=関数式ということになります。少しややこしい話なのですが、他の言語では「関数式」という言葉ではなく「無名関数」という言葉がつかわれるのでこのようなことになっています。
他言語(C#とか)で「無名関数」と呼ばれる機能はJSでは「関数式」と呼ばれる、という理解でよいです。
さて[3]ですが、これはエラーになってしまいます。前回ページの「関数宣言」と比べてみてください。関数宣言の場合は、宣言が上で書かれていても、下で書かれていても、動きました。「関数式」の場合は、そうはいきません。
変数に代入されてから、その変数を使うので、変数に代入されていなければ動かないのは当たり前のこと、ということになります。
これが、関数式です。