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 サーバーを見てみましょう。
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);