在连接模块中的res._renderHeaders函数

时间:2013-05-25 14:04:02

标签: javascript node.js

我正在研究connect模块中的patch.js。有一些代码如下:

var http = require('http')
  , res = http.ServerResponse.prototype
  , setHeader = res.setHeader
  , _renderHeaders = res._renderHeaders
    ...

res._renderHeaders = function(){
    if (!this._emittedHeader) this.emit('header');
    this._emittedHeader = true;
    return _renderHeaders.call(this);
  };

我对res._renderHeaders函数定义中的这个奇怪代码感到困惑。在回报中,它正在呼唤自己?它会递归调用自己吗?或者正确的运行过程是什么?

res.writeHead,res._renderHeaders也会出现类似的情况。

2 个答案:

答案 0 :(得分:0)

它不是在呼唤自己,而是在调用之前的实现:

// store reference to 'old' implementation
_renderHeaders = res._renderHeaders;
...
// create a new implementation
res._renderHeaders = function(){
  ...
  // which calls the old implementation
  return _renderHeaders.call(this);
};

答案 1 :(得分:0)

行。让我们在这里说得更清楚。 //调用旧的实现 return _renderHeaders.call(this);

上面的代码在旧实现中将当前res(http.ServerResponse.prototype)的旧实现称为“this”。 但是,如果写为return _renderHeaders(),那么旧实现中的“this”将是OutgoingMessage.prototype?