JavaScript では、関数を別の関数のパラメータにすることができます。 最初に関数を定義してからそれを渡すことも、パラメーターが渡される場所で直接関数を定義することもできます。

Node.js での関数の使用は JavaScript に似ており、たとえば次のように実行できます。

function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

上記のコードでは、say 関数を実行関数の最初の変数として渡しました。 ここで渡されるのは、say の戻り値ではなく、say 自体です。

このようにして、say は、execute のローカル変数 someFunction になり、execute は someFunction() (括弧付き) を呼び出すことで、say 関数を使用することができます。

もちろん、say には変数があるので、execute は someFunction を呼び出すときにそのような変数を渡すことができます。

匿名関数

関数を変数として渡すことができます。 ただし、この「最初に定義し、後で渡す」というサイクルを回避する必要はありません。この関数を別の関数の括弧内で直接定義して渡すことができます。

function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

実行に渡す関数を直接定義します。ここで、execute は最初の引数を受け取ります。

この方法では、関数に名前を付ける必要さえなくなり、それが匿名関数と呼ばれる理由です。

関数の受け渡しによって HTTP サーバーが機能する仕組み

この知識を基に、単純ではあるが単純ではない HTTP サーバーを見てみましょう。

var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);

これで、はるかに明確になるはずです。匿名関数を createServer 関数に渡しました。

次のコードでも同じ目標を達成できます。

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);