毎回「これってどうなってるんだっけ?」となるので
頭の整理のためにまとめます。
高階関数とは?
高階関数は、以下の両方もしくはどちらかに該当する関数のこと。
- 関数を返す
- 関数を引数にとる
たとえば以下の場合、後者に該当するので、mainが高階関数となる。
//高階関数 function main(fn){ fn(); } //普通の関数 function sub(){ } //高階関数に関数を渡して実行 main(sub);
以下のように、匿名関数を渡すこともできる。
//高階関数 function main(fn){ fn(); } //引数に匿名関数を渡して実行 main(function (){ });
コールバック関数とは?
高階関数に引数として渡される関数のこと。
さきほどの例で言うと、以下のような感じ。
//高階関数 function main(fn){ fn(); } //普通の関数 ←この関数のことを「コールバック関数」と呼ぶ。 function sub(){ } //高階関数にコールバック関数を渡して実行 main(sub);
この場合、
- main関数 → 高階関数
- sub関数 → コールバック関数
となる。
要するに
- 高階関数 → 元請け
- コールバック関数 → 下請け
みたいな感じ。
コールバック関数に引数を渡す
この辺からややこしくなってくるのだけど
コールバック関数に引数を渡すこともできる。
//高階関数 function main(fn){ fn("コールバックに渡す引数だよ"); } //コールバック関数 function sub(arg){ alert(arg); } //高階関数に関数を渡して実行 main(sub);
要するに
- 高階関数
→ 元請け
- コールバック関数
→ 下請け
- コールバック関数に渡す引数
→ 元請けから下請けに渡されるデータ
みたいな感じ。
ちなみに上のコードを実行すると
以下のように「コールバックに渡す引数だよ」というアラートが表示される。
以下のような「匿名のコールバック関数に引数を渡す」という組み合わせもよく使われる。
//高階関数 function main(fn){ fn("コールバックに渡す引数だよ"); } //高階関数に匿名のコールバック関数を渡して実行 main(function (arg){ alert(arg); });
例えば、以下はNode.jsでサーバーを立ち上げるようなコード。
// Node.jsの標準モジュールであるhttpを使う var http = require('http'); var server = http.createServer(); //serverオブジェクトのonメソッドは、第2引数にコールバック関数を取る server.on('request', function(req, res) { res.writeHead(200, {'Content-Type' : 'text/plain'}); res.write('hello world'); res.end(); }); // サーバを待ち受け状態にする // 第1引数: ポート番号 // 第2引数: IPアドレス server.listen(3000);
おわり
コメント