関数を値として扱う — 渡す・返す・包む

関数は値なので、変数に入れ、配列に並べ、引数として渡せます。map に渡している形の正体、関数を返す関数、既存の関数を包んで機能を足す形までを実行して確かめます。

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

関数は値です。 数値や文字列と同じように扱えます。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 6, 4 ] 10 function
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 2, 4, 6 ] [ 2, 4, 6 ]

変数に入れ、配列に並べ、オブジェクトの値にできます。 引数として渡すこともできます。

map() に渡しているもの

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
10 15
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 10, 20, 30 ]

この2つは同じことをしています。

map() は「配列の各要素に、渡された関数を適用する」だけの関数です。 何をするかは、渡す側が決めます。

関数を受け取る関数、または関数を返す関数を高階関数と呼びます。 map() filter() sort() は全部そうです。 → 配列を変換する・絞り込む

関数を返す

第2回で見た形です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
呼ぶ: add [ 1, 2 ] 3
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2 4

「先に決まるもの」を固定した関数を作れます。 これを部分適用と呼びます。

map() にそのまま渡せます。

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

try {
[1, 2, 3].map(double(0));
} catch (error) {
console.log(error.name);
}
TypeError
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 2, 4, 6 ]

既存の関数を包む

関数を受け取って、機能を足した新しい関数を返します。

javascript
console.log(['1', '2', '3'].map(parseInt));
[ 1, NaN, NaN ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 1, 2, 3 ] [ 1, 2, 3 ]

元の add は書き換えていません。 包んだ新しい関数を作っただけです。

...args引数を全部受けて、そのまま渡しています。 だから、どんな関数にも使えます。 → 関数の引数 — 既定値・可変長・分割代入

記録・計測・再試行・キャッシュは、この形で足せます。 → 失敗したら再試行する

繋げる

javascript
const user = {
name: 'あ',
greet() {
return this.name;
},
};

const fn = user.greet;

console.log(fn());
undefined
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8

twice(add1) が「2回足す関数」になり、それをさらに twice() に渡せます。

関数を組み合わせて新しい関数を作れるのが、値である利点です。

よくある間違い

呼び出しと参照を取り違える

double(0)その場で呼んだ結果0)です。関数ではありません。 map() はそれを呼ぼうとして落ちます。

Node 22.22.3 の文言は「number 0 is not a function」。処理系によって変わります。TypeError: x is not a function

渡すときは () を付けません。

引数が3つ渡ることを忘れる

map() はコールバック関数に (値, 添字, 配列) の3つを渡します。 parseInt(値, 添字) として呼ばれ、添字が何進法かの指定になってしまいます。

関数名をそのまま渡すときは、第2・第3引数をどう扱うか確かめてください。

Array.prototype.map()

メソッドを取り出して渡す

取り出した時点で user との繋がりが切れています。 this呼ばれ方で決まるからです。

bind() で結んでおけば渡せます。

なぜ this は呼び方で変わるのか

まとめ

  • 関数は。変数・配列・オブジェクト・引数のどこにでも置ける
  • map() に渡しているのは値としての関数
  • 関数を返せば、先に決まるものを固定した関数が作れる
  • 包めば、元を書き換えずに機能を足せる
  • 渡すときは () を付けない
  • map() は3つの引数を渡す。map(parseInt) と書かない
  • メソッドを取り出すと this が外れる。渡すなら bind()

この連載はここまで

関数を作り、変数の見える範囲を知り、値として扱うところまで来ました。 ここから先は、必要になったときに引ける形でまとめてあります。

この記事の根拠

  1. Function Objects — ECMAScript® 2026 Language Specificationtc39.es
  2. Array.prototype.map — ECMAScript® 2026 Language Specificationtc39.es
  3. Function.prototype.bind — MDNdeveloper.mozilla.org

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

このページの原文(Markdown)