関数の基本 — 作る・呼ぶ・返す

関数の3つの書き方と、それぞれで変わること。戻り値を書き忘れたときに何が返るか、アロー関数でオブジェクトを返すときの落とし穴までを、実行しながら確かめます。

実行して検証済み処理系Node 22.22.3対応ES1難易度○○○○目安9更新

関数は、まとまった処理に名前を付けて、何度でも呼べるようにするしくみです。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
6 20
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2 2 2

(n)受け取るものreturn返すものです。

書き方は3つある

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2
javascript
notYet(1);

const notYet = (n) => n + 1;
ReferenceError: Cannot access 'notYet' before initialization

結果は同じです。違うのは書き方と、次の2点だけです。

定義より前で呼べる this
function 宣言 呼べる 呼ばれ方で決まる
関数式(const f = function 呼べない 呼ばれ方で決まる
アロー関数(const f = () => 呼べない 持たない

定義より前で呼べるかどうか

function で書いた関数は、丸ごと先に読まれます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
動いた undefined
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
負 正か0

const に入れた関数はそうなりません。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
4 undefined
javascript
const wrong = (n) => { value: n };

console.log(wrong(1));
undefined

同じ「関数」でも書き方で挙動が違います。ReferenceError: Cannot access 'x' before initialization

迷ったら、定義を使うところより上に書いてください。 そうすれば書き方に左右されません。

返さないと undefined

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ value: 1 }
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
declared expression arrow

return が無い関数は undefined を返します。エラーにはなりません。

returnそこで関数を抜けます。あとの行は実行されません。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
load
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8

先に返して抜ける書き方は、入れ子を浅くできるのでよく使われます。

アロー関数の {} に注意

アロー関数は、{} を書くかどうかで意味が変わります。

javascript
const double = (n) => n * 2;

console.log(double);
console.log(double + 1);
[Function: double] (n) => n * 21
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
3 NaN
  • {} なし … その式の値がそのまま返る
  • {} あり … ふつうの関数と同じ。return が要る

{} を書いて return を忘れるのは、いちばん多い間違いです。 map()undefined が並ぶのも同じ原因です。 → Array.prototype.map()

オブジェクトを返すときは丸括弧

{関数の本体と読まれています。value: はラベルとして無視されます。

丸括弧で囲むと、オブジェクトとして読まれます。

=> ({ ... }) はそのまま覚えてしまうのが早いです。

名前を付ける

const に入れた関数にも、変数名から名前が付きます。 エラーの表示に出るので、名前があると原因を追いやすくなります。

その場で書いた関数には名前がありません(空文字)。 2行目が空いているのは、名前が空文字だからです。

どれを使うか

新しく書くならアロー関数が短くて済みます。 ただし次の場合は function を使ってください。

  • オブジェクトのメソッドとして書く(this が要る)
  • 定義より前で呼びたい

アロー関数は this を持たないので、メソッドには向きません。なぜ this は呼び方で変わるのか

よくある間違い

呼ばずに関数そのものを渡す

() を付けないと、関数そのものが値として扱われます。 文字列と足すと、コードがそのまま繋がります。

画面に関数の中身が出たら、() の付け忘れを疑ってください。

引数の数が合わなくても落ちない

多すぎても少なすぎてもエラーになりません。 足りない分は undefined になり、計算に使うと NaN です。

既定値を書いておくと防げます。 → 関数の引数 — 既定値・可変長・分割代入

まとめ

  • 書き方は3つ。結果は同じで、違うのは「前で呼べるか」と「this
  • function 宣言だけが定義より前で呼べる
  • return が無ければ undefinedエラーにはならない
  • アロー関数で {} を書いたら return が要る
  • オブジェクトを返すなら => ({ ... })
  • 引数の数が合わなくても落ちない

次に学ぶ

関数の中で作った変数がどこから見えるかを学びます。 そして「関数が、作られた場所の変数を覚えている」という性質(閉包)まで進みます。

第2回: スコープと閉包

この記事の根拠

  1. Function Definitions — ECMAScript® 2026 Language Specificationtc39.es
  2. Arrow Function Definitions — ECMAScript® 2026 Language Specificationtc39.es
  3. 関数 — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)