B バイナンス · 世界最大級の暗号資産取引所バイナンス 登録 → AD OKX OKX · 世界の大手暗号資産取引所OKX 登録 → AD
💻 コーディングの基礎 · 第5講 / 10

関数 — 名前を付けた小さな機械に分ける

関数は、入力を受け取って処理し、結果を返す名前付きのコードのまとまりです。結果は `console.log` で画面に出すのではなく `return` で返してこそ、ほかのコードが続けて使え、テストもしやすくなります。

⏱ 約22分 ✍️ 確認問題 5問 🧪 コード実習 4題 更新 2026-10-09
🎯 この講義の学習目標
  • 引数と戻り値のある関数を作り、呼び出して使える
  • return と console.log の違いを説明し、状況に合わせて使い分けられる
  • アロー関数で短い関数を書き、波かっこを使ったときの return の落とし穴を避けられる
  • 長い計算を小さな純粋関数に分け、入力と期待値で試せる

1.関数とは何か — 入力を受け取って結果を返す機械

第1講では、プログラムを入力 → 処理 → 出力として見ました。関数は、その構造を小さく切り出して名前を付けたものです。自動販売機を思い浮かべるとわかりやすいでしょう。お金を入れてボタンを押せば(入力)、中で何が起きているか知らなくても飲み物(結果)が出てきます。一度作っておけば、同じ自動販売機を何度でも使えます。

関数がなければ、同じ計算を使うたびにコードをコピーしなければなりません。そのうち計算のルールが変わると、コピーした場所をすべて探して直す必要があり、一か所でも直し忘れれば結果が食い違います。関数にしておけばルールは一か所にしかなく、直すときもそこだけ直せば済みます。また vatOf(price) のように名前を見るだけで何をするのかわかるので、コードが文章のように読めます。

関数を作ることを「定義する」、使うことを「呼び出す」と言います。定義しただけでは何も起きません。名前のあとにかっこを付けて vatOf(10000) のように呼び出して、はじめて本体が実行されます。かっこを付けずに vatOf とだけ書くと関数そのものを指すだけで実行はされないので、注意してください。

定義は一度、呼び出しは何度でも — 架空の税率10%の税額計算
function vatOf(price) {
  return price * 0.1;
}
console.log(vatOf(10000));
console.log(vatOf(25000));
出力
1000
2500

2.引数と戻り値

関数名のあとのかっこの中にある price を引数(仮引数)と言います。関数の中で使う「空欄の名前」です。呼び出すときに渡す実際の値 10000 は実引数と呼びます。呼び出すと、実引数が引数に入った状態で本体が実行されます。引数が複数あるときはカンマで区切り、実引数は書いた順番どおりに入ります。順番を入れ替えて渡すとエラーなしにとんでもない結果が出るので、順番が大切です。

return は結果を呼び出し元に返し、関数をその場で終わらせます。return より下にある行は実行されません。return がないか、値なしで return; とだけ書くと、関数は undefined を返します。実引数を渡し忘れた場合も、足りない引数は undefined になり、計算に使われると第2講で見た NaN が出ます。JavaScript はこうした場合でもエラーを出さないので、自分で確かめる必要があります。

実引数がないときに使う値をあらかじめ決めておくこともできます。引数のあとに = 値 を付けるとデフォルト値になります。下のコードでは rate を渡さなければ0.1が使われます。デフォルト値は「ふつうはこの値」という設定によく合いますが、必ず受け取るべき値にデフォルト値を付けると、うっかり渡し忘れても気づけないので、使いどころを選びましょう。

実引数が抜けると undefined → NaN、デフォルト値があればその値
function rectArea(w, h) {
  return w * h;
}
console.log(rectArea(3, 4));
console.log(rectArea(3));

function tax(price, rate = 0.1) {
  return price * rate;
}
console.log(tax(20000));
console.log(tax(20000, 0.05));
出力
12
NaN
2000
1000

3.`return` と `console.log` — いちばんよくある混同

関数を学び始めたときにいちばん混同しやすいのが、「返すこと」と「画面に出すこと」の違いです。どちらも結果が見えるように思えますが、していることはまったく違います。console.log は人が見るために値を画面に書き出すもので、プログラムはその値を続けて使えません。return は値を呼び出したコードに手渡すもので、受け取った側は変数に入れたり、別の計算に使ったりできます。

下のコードの showDouble は結果を出力するだけで、返しません。そのため showDouble(4) を変数に入れると、画面には8が出ますが変数には undefined が入り、それに1を足すと NaN になります。電卓をたたいて答えを画面に表示したことと、その答えを次の計算に引き渡したことの違いだと考えればよいでしょう。

このページの実習の採点も同じ仕組みです。採点機は関数を呼び出し、「返ってきた値」を期待値と比べます。関数の中で正解を console.log で出力するだけだと、画面には正しい数字が見えても採点は失敗します。原則は簡単です。計算する関数は return で返し、画面に出す作業は関数を呼び出した外側で行います。

出力するだけの関数と、返す関数
function showDouble(x) {
  console.log(x * 2);
}
function double(x) {
  return x * 2;
}
const a = showDouble(4);
console.log('a の中身', a, a + 1);
const b = double(4);
console.log('b の中身', b, b + 1);
出力
8
a の中身 undefined NaN
b の中身 8 9
`return` と `console.log` の比較
`return``console.log`
誰に向けて関数を呼び出したコード画面を見る人
値を続けて使えるか使える(変数・計算に使用)使えない
関数は終わるかその場で終わるそのまま次の行へ進む
実習の採点返した値で採点採点には使われない
主に使う場所計算する関数の中確認・デバッグ、最終的な出力

4.アロー関数 — 短く書く別の文法

関数は const 名前 = (引数) => 式 という形でも書けます。これをアロー関数と言います。矢印の右側が式一つだけなら、その式の値が自動的に返されるので return は書きません。第6講で学ぶ map・filter のように関数をほかの関数に渡すときに特によく使われ、AIが書いたコードでもよく見かけます。

注意すべき落とし穴が一つあります。矢印の右側に波かっこを書くと、そこからは通常の関数の本体として扱われ、return を自分で書かなければなりません。下の bad は波かっこの中に式だけを書いて return を忘れたため、undefined を返します。エラーが出ないので、結果を出力してみるまで気づかずに見過ごしがちです。短ければ波かっこなし、複数行なら波かっこと return をセットで、と覚えておきましょう。

function で書いた関数とアロー関数は、この講座で扱う範囲では同じ働きをします。細かな違い(たとえば this の扱い方)はありますが、基礎の段階では知らなくてもかまいません。どちらかが「優れている」わけではないので、一緒に働く人やプロジェクトが使っている書き方に合わせれば十分です。

波かっこを使うなら return を自分で書く
const add = (a, b) => a + b;
const square = (x) => x * x;
const bad = (x) => { x * x; };
const good = (x) => {
  const y = x * x;
  return y;
};
console.log(add(2, 3), square(4));
console.log(bad(4), good(4));
出力
5 16
undefined 16

5.関数の中の変数は関数の中だけ — スコープ

関数の中で let や const で作った変数は、その関数の中でしか見えません。これを有効範囲(スコープ)と言います。関数が終わるとその中の変数も消えるので、外側でその名前を使うと ReferenceError が出ます。エラーメッセージの is not defined は「その名前はここからは見えない」という意味です。メッセージの正確な文言はブラウザーによって少しずつ違うことがあります。

はじめは不便に思えますが、この規則のおかげで関数どうしが互いに邪魔をしません。いくつもの関数がそれぞれの中で total という名前を使っても混ざりません。関数の中で計算した値を外で使いたいなら、外の変数をこっそり書き換えるのではなく return で返してください。繰り返し文や条件文の波かっこの中で作った let・const も同じく、その波かっこの中でしか見えません(第4講で累積用の変数を繰り返し文の上に置いた理由です)。

関数の外からは中の変数が見えない
function makeTotal() {
  const inside = 100;
  return inside + 1;
}
console.log(makeTotal());
console.log(inside);
出力
101
ReferenceError: inside is not defined

6.小さな関数に分ける

長い計算をひとかたまりで書くと、どこで間違えたのか探しにくくなります。代わりに「一つのことだけをする」小さな関数をいくつも作って組み立てれば、部品ごとに別々に試せるうえ、名前が説明の役目を果たします。関数名は getTotal、isAdult のように、することを動詞で表します。真偽を返す関数は is・has で始める慣習があります。

分ける場所を見つけるための問いは、「この部分を一文で説明できるか」です。「商品の価格をすべて足す」「合計に応じて送料を決める」のように一文になれば、それが関数一つです。説明に「そして」が何度も入るなら、まだ分けられるという合図です。ただし一行で済む計算を細かく刻みすぎるとかえって読みにくくなるので、名前を付けるだけの意味がある単位で分けましょう。

例題架空のネットショップのルール: 商品の価格をすべて足し、合計が50,000ウォン以上なら送料0ウォン、そうでなければ3,000ウォンを足します。この計算を関数にどう分ければよいでしょうか。
function subtotal(prices) {
  let sum = 0;
  for (const p of prices) {
    sum += p;
  }
  return sum;
}
function shippingFee(sum) {
  return sum >= 50000 ? 0 : 3000;
}
function orderTotal(prices) {
  const sum = subtotal(prices);
  return sum + shippingFee(sum);
}
console.log(orderTotal([20000, 10000]));
console.log(orderTotal([30000, 20000]));
出力
33000
50000
  1. ステップ1 文に分ける: 「価格をすべて足す」/「合計から送料を決める」/「二つを足して最終金額を出す」。
  2. ステップ2 部品の関数: subtotal(prices) は第4講の累積パターン、shippingFee(sum) は第3講の条件文です。
  3. ステップ3 組み立て: orderTotal(prices) は二つの部品を呼び出すだけです。ルールが変われば(例: 基準が60,000ウォン)shippingFee の一か所だけを直します。
  4. 検算: [20000, 10000] → 合計30,000 + 送料3,000 = 33,000。[30000, 20000] → 合計50,000(境界値で「以上」なので無料)= 50,000。
答え合計・送料・最終金額をそれぞれの関数に分けて組み立てる: 33000、50000
条件 ? 値1 : 値2 は、条件が真なら値1、偽なら値2になる短い条件式(三項演算子)です。第3講の if/else を一行で書いたものと考えればよいでしょう。長くなるなら if で書いたほうが読みやすくなります。

7.純粋関数とテストしやすいコード

同じ入力を渡せばいつも同じ結果を返し、外側の変数や画面などを変えない関数を純粋関数と言います。double(4) はいつ呼び出しても8です。一方、下の addVisit は外側の変数 visits を変えるので、同じ呼び出しが呼ぶたびに違う値を返します。こうした関数は、結果が「これまでに何が起きたか」によって変わるので、原因を追いにくくなります。

純粋関数の最大の長所は、テストが簡単なことです。「この入力ならこの結果」という表さえあればよいからです。関数を作ったら、ふつうの場合、境界値(0、空のリスト、基準とぴったり同じ値)、おかしな入力をいくつか選んで先に期待値を書き、結果と比べてみてください。このページの実習の採点方法がまさにこれで、第10講でAIの書いたコードを検証するときも同じ方法を使います。

もちろん、すべての関数を純粋にできるわけではありません。画面に出す、ファイルを保存する、サーバーに送るといった作業は、外側を変えることそのものが目的です。コツは、計算は純粋関数として切り分けておき、外側を変える作業は端の数か所にまとめることです。そうすれば間違えやすい計算の部分は表で試せ、外側を変える部分は短いので目で確かめやすくなります。

同じ呼び出しで違う結果(純粋でない)vs いつも同じ結果(純粋)
let visits = 0;
function addVisit() {
  visits++;
  return visits;
}
console.log(addVisit(), addVisit());

const nextCount = (n) => n + 1;
console.log(nextCount(0), nextCount(0));
出力
1 2
1 1
入力と期待値の表で自分で試す — 架空の基準19歳という境界値を必ず入れる
const isAdult = (age) => age >= 19;
function check(input, want) {
  const got = isAdult(input);
  const ok = got === want;
  console.log(input, ok ? '合格' : '不合格');
}
check(18, false);
check(19, true);
check(0, false);
出力
18 合格
19 合格
0 合格

📌 要点まとめ

  • 関数は入力(引数)を受け取って処理し、結果を return で返す名前付きのコードである
  • console.log は人に見せるだけで、ほかのコードが使うには return しなければならない
  • 実引数が抜ければ undefined、return がなければ undefined — エラーなしに NaN になりうる
  • アロー関数に波かっこを使うなら return を自分で書く
  • 一文で説明できる小さな純粋関数に分ければ、入力と期待値の表で試しやすい

✍️ 確認問題

まず自分で解いてから「解答と解説」を開いてください。

Q1. function f(x) { console.log(x + 1); } のとき、const r = f(2); のあと r に入っている値はどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ② undefined

f は3を画面に出すだけで return がないので、undefined を返します。値を続けて使うには return x + 1; に直します。

Q2. const g = (x) => { x * 2; }; で g(5) の結果はどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ② undefined

波かっこを使うと本体として扱われ、return を自分で書く必要があります。(x) => x * 2 のように波かっこを外すか、{ return x * 2; } に直します。

Q3. function area(w, h) { return w * h; } を area(5) で呼び出すとどうなるでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ③ NaN

h に実引数が渡されないので undefined になり、5 * undefined は NaN です。JavaScript は実引数の数が違ってもエラーを出しません。

Q4. 次のうち、純粋関数はどれでしょうか。

⭕ 正解です

❌ もう一度考えてみましょう

解答と解説
正解 ② 受け取った二つの数のうち大きいほうを返す関数

二つの数の大きいほうは、同じ入力ならいつも同じ結果で、外側を変えません。外側の変数を変える、時刻のように入力以外のものに頼る、画面に出すといったことは純粋ではありません。

Q5. 関数の中で const で作った変数を関数の外で使うと、どんな種類のエラーが出るでしょうか。エラーの名前を書いてください。

解答と解説
解答例 ReferenceError(… is not defined)

関数の中の変数はその関数の中でしか見えません。外でその値が必要なら、return で返してもらって変数に入れます。

🧪 コード実習

計算する関数は値を返さないと採点されません。画面に出すだけのコードを直す問題から、小さな関数を組み立てる問題まで、順に解いてみましょう。

コードはこのブラウザの中の隔離された場所でだけ実行され、サーバーには送られません。ネットワークには接続できず、2秒を超えると止まります。書き換えたコードはこのブラウザにだけ保存されます。Ctrl+Enter(⌘+Enter)で実行、Tabキーは空白2つ(Escの後のTabで次へ移動)。

JavaScriptが無効なので実行はできませんが、問題・最初のコード・自動チェックの内容・解答例はそのまま読めます。

1摂氏を華氏に

摂氏の温度 c を受け取り、華氏の温度を返す関数 cToF(c) を作ってください。公式は 華氏 = 摂氏 × 9 / 5 + 32 です。例: cToF(100) は212。

自動チェック
  • cToF(0)期待値 32
  • cToF(100)期待値 212
  • cToF(-40)期待値 -40
  • cToF(36.5)期待値 97.7
💡 ヒント

return がないと、関数は undefined を返します。

解答例を見る
function cToF(c) {
  return c * 9 / 5 + 32;
}

2出力するだけの関数を直す

架空のネットショップの送料を求める関数 shippingFee(sum) は、合計 sum が50,000ウォン以上なら0、そうでなければ3000を返さなければなりません。最初のコードは値を画面に出すだけなので採点に失敗します。値を返すように直してください。

自動チェック
  • shippingFee(12000)期待値 3000
  • shippingFee(50000)期待値 0
  • shippingFee(49999)期待値 3000
  • shippingFee(80000)期待値 0
💡 ヒント

console.log(値) を return 値 に変えれば大丈夫です。50,000は境界値で、「以上」なので無料です。

解答例を見る
function shippingFee(sum) {
  if (sum >= 50000) {
    return 0;
  }
  return 3000;
}

3小さな関数を組み立てる

価格の配列 prices を受け取り、最終的な支払い金額を返す orderTotal(prices) を作ってください。合計に送料(合計50,000ウォン以上なら0ウォン、そうでなければ3,000ウォン)を足します。ただし空の配列なら注文がないので0を返します。最初のコードにある subtotal・shippingFee を活用してください。

自動チェック
  • orderTotal([20000,10000])期待値 33000
  • orderTotal([30000,20000])期待値 50000
  • orderTotal([])期待値 0
  • orderTotal([49999])期待値 52999
  • orderTotal([60000,5000])期待値 65000
💡 ヒント

空の配列かどうかは prices.length === 0 で確かめます。その検査をいちばん前に置いてすぐに return すれば、下の計算は実行されません。

解答例を見る
function subtotal(prices) {
  let sum = 0;
  for (const p of prices) {
    sum += p;
  }
  return sum;
}
const shippingFee = (sum) => (sum >= 50000 ? 0 : 3000);

function orderTotal(prices) {
  if (prices.length === 0) {
    return 0;
  }
  const sum = subtotal(prices);
  return sum + shippingFee(sum);
}

4範囲の中に収める(アロー関数)

数 x を min 以上 max 以下に収めて返すアロー関数 clamp を作ってください。x が min より小さければ min、max より大きければ max、その間なら x のままです。例: clamp(15, 0, 10) は10。(min は max より大きくないものとします。)

自動チェック
  • clamp(15, 0, 10)期待値 10
  • clamp(-3, 0, 10)期待値 0
  • clamp(7, 0, 10)期待値 7
  • clamp(0, 0, 10)期待値 0
  • clamp(10, 0, 10)期待値 10
💡 ヒント

波かっこを使ったアロー関数なので、すべての分岐に return が必要です。Math.min と Math.max を重ねて一行で書く方法もあります。

解答例を見る
const clamp = (x, min, max) => {
  if (x < min) return min;
  if (x > max) return max;
  return x;
};

🤖 AIにはこう聞いてみましょう

コピーして [ ] の部分を自分の状況に書き換えて使います。答えはそのまま信じず、本文と比べて確かめましょう。

長いコードを関数に分けたいとき

下のJavaScriptのコードを「一つのことだけをする」小さな関数に分けてください。各関数の名前・引数・戻り値を表にまとめ、計算する関数は `console.log` を使わずに `return` するようにしてください。動作は変えずに、変わった点を行ごとに説明してください。コード: [貼り付け]

自分で作った関数を試すテスト表が欲しいとき

次の関数に渡すテストの入力と期待値を6つ、表にしてください。ふつうの場合2つ、境界値(0・空の値・基準と同じ値)3つ、おかしな入力1つとし、それぞれの期待値がなぜそうなるのか一行ずつ説明してください。関数の説明: [何をする関数か] コード: [貼り付け]

`return` と `console.log` がまぎらわしいとき

JavaScriptで `return` と `console.log` の違いがわかる、ごく短い例を3つ作ってください。どの例も実行結果は先に言わず、私が結果を予想して答えたら、合っているかどうかと理由を教えてください。

🧰 関連ツール

この講義で扱ったJSON・正規表現・テキストを、その場で確かめたり整えたりできるツールです。本物の個人情報やパスワードは貼り付けないでください。

参考
  • MDN Web Docs — JavaScriptガイド: 関数(Functions)
  • MDN Web Docs — アロー関数式、return 文、デフォルト引数のリファレンス
  • プログラミング入門書で扱われる、純粋関数と単体テストの一般的な考え方

学習目標をすべて達成できたら完了を押しましょう。

💻 コーディングの基礎

  1. 1プログラムとは — 仕事を順番・条件・繰り返しに分ける考え方
  2. 2値・変数・データ型 — 名札を付けて値を扱う
  3. 3条件分岐 — 状況によって違う道を進む
  4. 4繰り返し — 同じことを正確に何度もさせる
  5. 5関数 — 名前を付けた小さな機械に分ける
  6. 6配列とオブジェクト — データを入れて扱う
  7. 7文字列とテキスト処理 — 文字を切り出し、探し、置き換える
  8. 8デバッグとエラーの読み方 — 赤い文字を手がかりに変える
  9. 9かんたんな自動化の例 — 表の計算とテキストの整理をコードで
  10. 10AIが書いたコードを読んで検証する — テスト・セキュリティ・ライセンス・個人情報
📚 あわせて読みたい
📊表計算の作業を人工知能で手伝わせる、数式は必ず検証→ 💻人工知能のコーディング支援の使い方と危険、セキュリティとライセンス→ 💬外国語の会話練習相手としてAIを使う→ ⚙️業務自動化のアイデア探し、AIに任せる仕事の選び方→
← AI時代の基礎学力講座