Javascript回调传入的函数参数

时间:2014-10-15 16:01:01

标签: javascript node.js callback

我是javascript的新手 - 事件驱动的语言;我正在尝试学习Node.js,但回调函数让我很困惑。所以我读了一些教程,然后我想我得到它,直到我问自己以下问题。这是一个非常简单的代码片段,我想用它来说明我的问题。

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接收一个参数,而这个参数是一个回调函数定义。回调函数还需要两个参数(响应和请求),然后响应将写入一些东西。但谁将值传递给回调函数中的 响应 ?这是默认情况下在node.js中由createServer传递的吗?我可以更改请求和响应的顺序吗?如果我的理解是错误的,请纠正我。

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

  

但谁将值传递给回调函数中的响应?

如果你问谁为你的函数提供了response参数,那么答案(用最简洁的术语来说)就是Node.js.

如果您想在更深层次的代码级别理解它,可以检查源代码。他是definition for http.createServer()

exports.createServer = function(requestListener) {
  return new Server(requestListener);
};

可以看出,requestListener参数是您所指的回调。这用于实例化新的Server实例。

Server构造函数为defined in the same file,可以看出,requestListener gets registered as an event listener for the 'request' event

if (requestListener) {
    this.addListener('request', requestListener);
}

从那里开始,代码需要更深入地了解新请求进入时发生的所有事情,但至少我们可以看到服务器最终emits the request event req和{{ 1}}参数:

res

由于您的self.emit('request', req, res); 回调已被注册为请求事件的事件侦听器,因此它会接收这些参数。

  

这是由createServer在node.js中传递的吗?

如上所述,是 - 这是默认行为。

  

我可以更改请求和响应的顺序吗?

希望从上述所有内容中可以看出这一点,但为了完整起见,“不”。


编辑:为了解决你对回调的一些困惑,也许这会有所帮助......

首先,无论我们是在讨论“回调”,“事件监听器”,还是在事件编程中的任何其他常见惯例,重要的是要理解在一天结束时,他们都只是功能。使它成为“回调”的唯一因素是关于它如何以及何时被调用的一系列约定。

旁注:在这种特殊情况下,将createServer()参数称为“事件监听器”实际上更准确,因为它会响应特定事件(请求)而被调用

然而,无论哪种方式,它都没有什么神奇的不同。在某个地方,有人必须调用该函数,调用者将提供它收到的参数。作为回调/事件监听器的定义者/无论改变提供这些参数的顺序,你都无能为力,这意味着我们只需要依赖约定和/或文档。

答案 1 :(得分:0)

是的,createServer()会传递参数,因此您无法重新排序。