高階関数とコールバック関数と引数について整理【JavaScript】

毎回「これってどうなってるんだっけ?」となるので

頭の整理のためにまとめます。

高階関数とは?

高階関数は、以下の両方もしくはどちらかに該当する関数のこと。

  • 関数を返す
  • 関数を引数にとる

 

たとえば以下の場合、後者に該当するので、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);

 

おわり

コメント

タイトルとURLをコピーしました