当涉及到 javascript 回调时,我非常困惑......尤其是在尝试同时学习 Node 时。 你看,我理解将一个函数作为参数传递给另一个函数的概念,但最让我困惑的是“接受”回调函数的预制模块。
例如,一个简单的请求如下所示:
var request = require('request');
var url = 'http://www.google.com';
request.get(url, function(error, response, body) {
if(error){
console.log('This request resulted in an error', error);
}
console.log(body);
});
此 get 方法接受 url 和回调。 谁定义回调被接受?开发商的具体方法是什么? 另外,我们在函数中传递的 3 个参数(错误、响应和正文)...请求模块如何知道在返回时用数据填充这些变量?
最佳答案
想象一下 get
的实现或多或少类似于
function get(url, callback) {
var response = they somehow retrieve the response;
var body = they somehow parse the body;
var error = ...;
// they call you back using your callback
callback( error, response, body );
}
如何计算这些值是无关紧要的(这是他们的实际工作),但他们只是回调你,假设你的函数实际上按给定的顺序接受三个参数(如果不是,你只会得到一个运行时错误)。
从这个意义上说,它们也通过......好吧,回调它来“接受”你的回调:) 不用担心参数的数量,因为 Javascript 非常“宽容” - 可以使用任意数量的参数调用方法,包括比函数预期更少或更多的参数。
以此为例:
// they provide 3 arguments
function get( callback ) {
callback( 0, 1, 2 );
}
// but you seem to expect none
get( function() {
});
get
假设回调接受三个参数,而我传递的方法据称不接受更少参数。这是可行的,尽管 0
、1
和 2
这三个参数没有绑定(bind)到任何正式的回调参数(您不能直接引用它们),但它们位于 arguments
对象中,这是一个类似数组的结构:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
再举一个例子
function get( callback ) {
callback( 0, 1, 2 );
}
get( function(a,b,c,d,e) {
});
这次我传递的回调似乎需要比调用者提供的更多参数,但这里仍然没有问题。参数绑定(bind)到连续的调用参数,a
将获取 0,b
将获取 1,c
将获取 2,d
和 e
将在回调体内获取 undefined
。
这两个例子都表明调用者并不真正关心你的回调是如何定义的,无论它的参数数量是否符合期望。如果出现任何不匹配,最糟糕的情况可能是出现运行时错误:
function get( callback ) {
callback( 0, 1, 2 );
}
get( 1 );
// Uncaught TypeError: callback is not a function
关于node.js - 了解回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37423601/