CHAPTER 3 · 9 LESSONS · 114 問

処理をまとめる(関数)

ひとまとまりの処理に名前をつけて、値を渡し、結果を受け取る。同じコードを何度も書かなくてよくなる。

変数が「値に名前をつける」仕組みだったのに対して、関数は「処理に名前をつける」仕組みだよ。この章のテーマはそれだけなのだけれど、影響は大きい。ここから先、書くコードのほとんどは関数の中身になる。

なぜ必要なのか。同じ処理を3か所で書いているとする。仕様が変わったとき、3か所とも直さなければならない。1か所直し忘れれば、そこだけ古い動きのまま残る。こういうバグは見つけにくい。処理を関数にまとめておけば、直す場所は常に1か所で済む。

関数には3つの登場人物がいる。呼び出す側渡す値返ってくる値だ。順番に覚えていこう。

まず定義と呼び出し。function greet() { ... } と書いて処理をまとめ、greet() と書いて動かす。定義しただけでは何も起きず、呼び出してはじめて中身が動く。ここは最初によく混乱するところだよ。

次が 引数。関数に外から値を渡す仕組みだ。function greet(name) のように受け取る名前を決めておき、greet("ゆい") のように呼ぶときに実際の値を渡す。これがあるおかげで、同じ関数を違う値で何度でも使い回せる。

そして 戻り値return で関数から結果を返す。返された値は呼び出した場所で受け取れるので、const total = sum(3, 5) のように書ける。returnconsole.log の違いは必ず押さえておきたい。console.log は画面に出すだけで、値はどこにも残らない。return は値を呼び出し元に渡すので、その後の計算に使える。「表示する」と「返す」は別のことだよ。

関数の書き方は3通り出てくる。function 宣言、関数式、そしてアロー関数(=>)。どれも同じことができる。今のコードではアロー関数をよく見かけるので、読めるようにはしておこう。

最後に スコープ。関数の中で作った変数は、その関数の中でしか見えない。外からは触れないし、外の同じ名前の変数とぶつかることもない。これは不便な制約ではなく、関数を安心して使い回すための仕組みだ。中で何をしていても外に影響しない、と保証されているから、関数は部品として成立する。

関数をどこで切るか、という悩みもここで出てくる。目安は名前がつけられるかどうかだよ。「この処理は何をしているか」を短い言葉で言えるなら、それは関数にできる。逆に「いろいろやっている」としか言えないなら、まだ切り方が大きすぎる。うまい名前が思いつかないときは、たいてい1つの関数に2つの仕事をさせている。

もうひとつの目安が長さだ。画面に収まらない関数は、たいてい分けたほうがいい。何行までという決まりはないけれど、スクロールしないと全体が見えない関数は、読むときに頭の中に収まらないよ。

関数を覚えると、コードを「小さな部品の組み合わせ」として書けるようになる。長い処理を一息に書くのではなく、意味のある単位に切って名前をつけていく。読みやすさも、直しやすさも、ここから変わってくるよ。

つまずいたときのために、ひとつ手がかりを置いておく。関数が思ったとおりに動かないときは、入口と出口を確かめるといい。関数の先頭で受け取った引数を表示してみる。return の直前で返す値を表示してみる。だいたいこの2か所で、想定と違う値が見つかるよ。

そして実際的な話をすると、ここから先の章はすべて関数の上に建っている。次の章のクラスは「関数をまとめたもの」だし、配列の道具に渡すのも関数だ。関数があいまいなまま進むと、後の章で必ず戻ってくることになる。手が止まったら、遠慮なくこの章に帰ってこよう。

この章のレッスン

関数を作って呼ぶ

  1. 41処理に名前をつけるいくつかの処理をひとかたまりにして、名前で呼び出せるようにしよう。 問題へ
  2. 42関数を変数に入れる関数も値のひとつ。変数に入れてから呼び出す書き方を覚えよう。 問題へ
  3. 43アロー関数で短く書く=> を使って、関数式をもっと短い形で書けるようにしよう。 問題へ

値を渡す(引数)

  1. 44関数に値を渡すかっこの中に値を渡して、呼ぶたびに結果が変わる関数を作ろう。 問題へ
  2. 45引数を複数受け取る, で区切って値をいくつも渡し、書いた順番どおりに受け取ろう。 問題へ

結果を返す(戻り値)

  1. 46関数から結果を返すreturn で計算結果を返して、呼び出したところで受け取ろう。 問題へ
  2. 47戻り値をそのまま使う戻り値を変数に入れずに、条件式や計算の中に直接組み込んでみよう。 問題へ

変数が見える範囲

  1. 48変数が届く範囲関数の中で作った変数がどこまで見えるのか、その範囲を整理しよう。 問題へ

組み合わせて解く

  1. 49関数のまとめ問題関数・引数・戻り値・スコープを組み合わせて解く総合演習。まとめなので基礎3問は無く、練習10問だけだよ。 問題へ

つぎは「同じ形をまとめて作る(クラス)」。設計図を書いて、そこから同じ形のデータを何個でも作る。データと振る舞いをひとつにまとめる考え方。