Node.jsの関数


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

Node.js での関数の使用は Javascript に似ています。たとえば、次のようにすることができます。

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

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

execute(say, "Hello");

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

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

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


匿名関数

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

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

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

whereexecute が最初のパラメーターを受け入れる関数を直接定義します。実行するために渡されます。

このように、関数に名前を付ける必要さえないため、この関数は匿名関数と呼ばれます。


関数の受け渡しによって 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);