Javascript 回调是如何得到它们的参数的?

Javascript 回调是如何得到它们的参数的?,javascript,asynchronous,callback,parameter-passing,Javascript,Asynchronous,Callback,Parameter Passing,我很难理解JavaScript中的回调如何获取参数。或者换句话说:如何实现高阶函数,使其回调接受标准的err和data参数 就像在一个回调的例子中,以一种常见的方式使用(我知道这很常见,因为我在Node.js moongose(即Node.js moongose)中看到了这种模式): 回调函数如何根据上面声明的getData()函数获取参数err&data 参数在调用函数时传递给该函数 函数foo(arg){ 控制台日志(arg); } foo(“这是价值”)参数在调用函数时传递给该函数 函

我很难理解JavaScript中的回调如何获取参数。或者换句话说:如何实现高阶函数,使其回调接受标准的
err
data
参数

就像在一个回调的例子中,以一种常见的方式使用(我知道这很常见,因为我在Node.js moongose(即Node.js moongose)中看到了这种模式):


回调函数如何根据上面声明的
getData()
函数获取参数
err
&
data

参数在调用函数时传递给该函数

函数foo(arg){
控制台日志(arg);
}

foo(“这是价值”)参数在调用函数时传递给该函数

函数foo(arg){
控制台日志(arg);
}


foo(“这是价值”)回调如何准确获取参数err&data?当您调用
getData
时,您将把整个
函数(err,data)
函数作为第二个参数传递给它,即第3行和第5行。如果您查看
getData
函数,这就是所谓的
callback
,仍然需要两个参数。如果您的响应成功,函数的
err
部分将变为null,
data
部分将变为
JSON.parse(response)
。但它究竟是如何变为null和data的呢?在过去的日子里什么都没有。如何将console.log(数据)传递给JSON.parse(响应)?确定。抱歉@LinasMickevicius太厚了。第3行和第5行。我终于明白了。我想我的大脑更倾向于同步和命令。我讨厌这个功能性的东西。感谢您的耐心。这只需要花些时间来理解,在您意识到之前,它会感觉完全正常和正常。回调究竟是如何获得参数错误和数据的?当您调用
getData
时,您将把整个
函数(err,data)
函数作为第二个参数传递给它,即第3行和第5行。如果您查看
getData
函数,这就是所谓的
callback
,仍然需要两个参数。如果您的响应成功,函数的
err
部分将变为null,
data
部分将变为
JSON.parse(response)
。但它究竟是如何变为null和data的呢?在过去的日子里什么都没有。如何将console.log(数据)传递给JSON.parse(响应)?确定。抱歉@LinasMickevicius太厚了。第3行和第5行。我终于明白了。我想我的大脑更倾向于同步和命令。我讨厌这个功能性的东西。谢谢你的耐心。这只是需要时间去了解,在你意识到之前,它会让你感觉完全正常和平常。我不是问什么时候,而是问怎么做。在您的示例中,您传递的是一些完全任意的“foo”,但在mongoose或文章的示例中,这是一个非常具体的东西:错误作为第一个参数,数据(即在数据库中创建的对象)作为第二个参数。另一个例子可能是Array.prototype.forEach中的回调-它还接受3个非常特定的参数(currentValue、index、Array)。我在问它是怎么做到的。读一下答案中的最后一句话,它是以完全相同的方式完成的,但是由库的实现者/幕后的特定功能完成的。对此,我太愚蠢了。参数在调用函数时传递给该函数,那么在moongoose model.create()中调用回调时传递的确切内容是什么呢。在准确的通话时间内,错误和数据是什么?如果数据还没有提交到数据库中,那么如何从数据库中检索数据呢。我差不多明白了@LinasMickevicius,完全直截了当地说——在文章中引用的这个实现者将是getData()函数,它决定第3行和第5行的错误和数据,对吗?好的。现在它终于穿透了我的头骨(比我想象的要厚得多)。只需忘记回调是一个动态声明的函数——因此,即使它看起来有点像是用两个参数(函数(err,data))调用某个函数,此时也没有调用任何东西,只有声明的(并在第3行和第5行的getData()中调用)。在连续两个月的JS写作之后,这是一个多么大的倒退啊!我不是问什么时候,而是问如何。在您的示例中,您传递的是一些完全任意的“foo”,但在mongoose或文章的示例中,这是一个非常具体的东西:错误作为第一个参数,数据(即在数据库中创建的对象)作为第二个参数。另一个例子可能是Array.prototype.forEach中的回调-它还接受3个非常特定的参数(currentValue、index、Array)。我在问它是怎么做到的。读一下答案中的最后一句话,它是以完全相同的方式完成的,但是由库的实现者/幕后的特定功能完成的。对此,我太愚蠢了。参数在调用函数时传递给该函数,那么在moongoose model.create()中调用回调时传递的确切内容是什么呢。在准确的通话时间内,错误和数据是什么?如果数据还没有提交到数据库中,那么如何从数据库中检索数据呢。我差不多明白了@LinasMickevicius,完全直截了当地说——在文章中引用的这个实现者将是getData()函数,它决定第3行和第5行的错误和数据,对吗?好的。现在它终于穿透了我的头骨(比我想象的要厚得多)。只需忘记回调是一个动态声明的函数——因此,即使它看起来有点像是用两个参数(函数(err,data))调用某个函数,此时也没有调用任何东西,只有声明的(并在第3行和第5行的getData()中调用)
function getData(options, callback) { 
    $.get("example.php", options, function(response) { 
        callback(null, JSON.parse(response)); 
    }, function() { 
        callback(new Error("AJAX request failed!")); 
    }); 
} 

// usage 
getData({name: "John"}, function(err, data) { 
    if(err) { 
        console.log("Error! " + err.toString()) 
    } else { 
        console.log(data); 
    } 
});