関数宣言、関数式と、説明してきました。
これのどちらがいいとか悪いとかはありません。書きやすいほうで書いたらいい、という感じなのですが、いくつか細かい差があって、こういうときは避けたほうがいいかもしれない、という問題があります。
サンプルで説明します。
for は繰り返し処理を行うものです。今回は0~9 の10回繰り返せという命令を書いています。
繰り返し処理のときに問題になる場合があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//[1] function plus1(a, b) { return a + b; }; for (let i = 0; i <= 9; i += 1) { console.log(plus1(i, 1)); // 1 ~ 10 が表示される } //[2] const plus2 = function(a, b) { return a + b; }; for (let i = 0; i <= 9; i += 1) { console.log(plus2(i, 1)); // 1 ~ 10 が表示される } //[3] for (let i = 0; i <= 9; i += 1) { const plus3 = function(a, b) { return a + b; }; console.log(plus3(i, 1)); // 1 ~ 10 が表示される } |
[1] は関数宣言の書き方です。[2]は関数式の書き方です。この2つは大差ない感じです。
そして関数式をループの内部で書く[3]のような書き方もあります。これは10回程度のループなら何も問題がないのですが、これが、1万回とかのループになると、問題になってきて避けたほうがよいと言われています。
plus3の変数に関数式を代入するということは、変数に関数オブジェクトと呼ばれるオブジェクトを作って変数に代入する、ということになります。
つまり、plus3の中身は同じもので書き換えが必要もないのに、わざわざ、ループの回数分、オブジェクトを作って代入するということをしているので、そこに処理時間がかかってしまったりメモリを余計に消費してしまい望ましいものではない、とされています。
実際に測定したわけではないのですがちょっと配慮してプログラムを書いたほうがいいかもしれません。
ただ、多くのプログラムではそれほど問題になるわけでもなく、遅いとか重いとか、メモリを食いすぎて落ちるとかいうときに対処すればよい。という程度の問題のような気もします。
私自身も実務でこのような処理が問題になった場面はありません。
「問題になる可能性がある」程度に理解しておくのがよいと思います。
関数式と関数宣言のどちらを使ったらいいのか、ということには、ほとんどの場合、どちらでもよい。という理解で大丈夫だと思います。