在下面的代码中,我使用node.js发出一个简单的get请求,并将响应记录到控制台。这工作得很好,但是为什么呢? response.on部分中发生了什么?为什么console.logconsole.error可以不带任何参数地工作?

var http = require('http')
http.get('http://www.google.com/index.html', function (response) {
    response.setEncoding('utf8')
    response.on('data', console.log) // <---
    response.on('error', console.error) // <---
})

最佳答案

他们确实有争论。它们采用参数作为response.on回调提供的参数。

内联传递函数作为匿名函数:

response.on('data', function(data){ // anonymous function passed inline
    console.log(data);
});


与在外部定义它们并通过名称传递它们相同:

...
response.on('data', callback)
...
function callback(data){ // < named function defined outside
    console.log(data);
}


从本质上讲,您所做的就是将整个内联函数带到外部,并为其命名为callback。然后,您将此名称作为参数传递给您,在此之前您已在此定义了整个函数内联。
(这也是IMO的一种更好的做法。特别是如果您发现自己在多个级别内传递内联函数,则可能会遇到严重的回调地狱问题。(more info))

同样,console.log也是一个(命名的)函数,因此您也可以将其作为参数传递:

response.on('data', console.log)

09-25 17:09
查看更多