在下面的代码中,我使用node.js发出一个简单的get
请求,并将响应记录到控制台。这工作得很好,但是为什么呢? response.on
部分中发生了什么?为什么console.log
和console.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)