2015-06-12 1 views
2

В приведенном ниже коде я делаю простой запрос get с node.js и регистрирует ответ на консоль. Это прекрасно работает, но почему? Что происходит в разделе response.on? Почему console.log и console.error работают без каких-либо аргументов?console.log() как обратный вызов в response.on()

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) // <--- 
}) 
+1

console.log в качестве обратного вызова будет выполняться и передаются данные о событии – Eric

+0

@Eric, где я могу найти, что упомянуто в документации? – shmuli

+1

Если 'console.log' было числом, вы могли бы передать его функции. Возможно, вы бы назвали его 'x' в функции и использовали' x + 5'. Точно так же, когда 'console.log' является функцией, вы все равно можете передать ее другой функции и использовать' x() '. JavaScript имеет [первоклассные функции] (http://helephant.com/2008/08/19/functions-are-first-class-objects-in-javascript/). – Ryan

ответ

1

Они сделать аргументы берут. Они принимают аргументы, как это делает обратный вызов 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. Затем вы передали его этим именем в качестве аргумента, в котором вы ранее определили всю встроенную функцию.
(Это лучшая практика тоже ММО. Особенно, если вы оказываетесь проходя встроенные функции глубоко вниз более чем на одном уровне вы можете получить серьезные проблемы обратного вызова ад. (more info))

Аналогично, console.log также (имени) функции, и поэтому вы можете передать, что в качестве аргумента тоже:

response.on('data', console.log) 
Смежные вопросы