我意识到这更像是一个普遍的问题,但我在这里已经阅读了类似的答案,但我找不到更多的概述。我不熟悉回调,而我正试图了解何时应该使用它们。
MDN网络文档有这个例子;
function greeting(name) {
alert('Hello ' + name);
}
function processUserInput(callback) {
var name = prompt('Please enter your name.');
callback(name);
}
processUserInput(greeting);
然而,我很难看到这比以下更有益,我没有将问候语功能作为参数传递?
function greeting(name) {
alert('Hello ' + name);
}
function processUserInput() {
var name = prompt('Please enter your name.');
greeting(name);
}
processUserInput();
答案 0 :(得分:3)
由于Javascript是异步的,有时很难处理来自非阻塞函数的响应,例如。如果您正在进行ajax调用,那么它将被异步执行并且结果将在稍后返回,到那时主执行流将传递ajax代码并开始执行以下语句,在这种情况下,它很难抓住进一步处理的响应。
为了处理这些情况,回调进入图片,你将一个函数作为参数传递给ajax函数,一旦返回响应,然后通过传递响应数据作为参数进一步处理来调用回调。
此处有更多信息http://callbackhell.com/
答案 1 :(得分:1)
简单来说,你可以说回调是一种提前询问问题(或请求任务)的方式,即当你完成这个时(通常是结果)。重点是要留出以后要完成的功能,通常是因为你现在没有必要的输入来完成它们。 您的实现与MDN之间的两个主要区别在于,您的实施难以维护,因此难以推断测试。
<强> 1。维护/可重用性
想象一下,您将几千行代码放入代码库中,然后您需要更改processUserInput()的功能。更容易更改或编写新的回调函数,而不是更改函数processUserInput()。如果processUserInput有点复杂,这将是显而易见的。这也意味着与您的实现不同,MDN在各种场景中更有用。你可以在不同的情况下重复使用它,例如说再见,大写名称等,只需编写不同的回调来插入processUserInput()。
<强> 2。测试/更容易推理
MDN实施更容易理解。更容易假设函数processUserInput(greeting)可能会返回一个问候语,而不是假设processUserInput()做什么。这样可以更容易测试,因为您始终可以确保MDN实现在输入时始终返回相同的输出。
答案 2 :(得分:1)
根据具体情况,回调可能非常有用;例如,在使用JavaScript进行Google Chrome浏览器扩展程序开发时,可以使用回调来拦截Web请求。
回调的目的通常是在触发器上执行回调例程 - 触发器是某种事件。通常,功能遵循链式API的接口。通过实现回调支持,您可以在操作阶段重定向执行流。回调对于第三方开发人员在处理别人库时会特别有用,具体取决于他们正在尝试做什么。把它们想象成一个通知系统。
一般参数的功能对灵活性和维护很有用。如果您对不同的东西使用不同的功能,可以一次又一次地重复使用这些功能以提供不同的功能 - 同时仍然可以反复使用或多或少相同的代码来防止源代码膨胀。同时,如果你将函数用于你自己的库并且出现了一个bug,你可以简单地为一个函数修补它,然后它就会被解决。
在您的示例中,您将回调例程传递给您正在调用的函数 - 您正在调用的函数将调用回调函数并传递正确的参数。这是灵活的,因为它允许你有一个回调例程调用打印变量的内容,另一个用于计算传入的字符串的长度,或另一个用于记录它在某处,等等。它允许你重新使用您设置的功能,并使用正确的参数调用不同的函数,而无需重新创建原始函数。
答案 3 :(得分:-2)
此示例不适合理解回调
在简单的语言回调中,当我们必须在之后执行或响应某些其他事件或函数或表达式时,会使用函数。 即当父函数完成其执行时,则执行回调。
简单示例
function hungerStatus(status,cb){
return cb(status)
}
function whatToDo(status){
return status ? "order Pizza" : "lets play"
}
hungerStatus(false,whatToDo)
另一个例子
// global variable
var allUserData = [];
// generic logStuff function that prints to console
function logStuff (userData) {
if ( typeof userData === "string")
{
console.log(userData);
}
else if ( typeof userData === "object")
{
for (var item in userData) {
console.log(item + ": " + userData[item]);
}
}
}
// A function that takes two parameters, the last one a callback function
function getInput (options, callback) {
allUserData.push (options);
callback (options);
}
// When we call the getInput function, we pass logStuff as a parameter.
// So logStuff will be the function that will called back (or executed) inside the getInput function
getInput ({name:"Rich", speciality:"JavaScript"}, logStuff);