了解回调函数的目的

时间:2017-12-20 13:24:25

标签: javascript callback

我意识到这更像是一个普遍的问题,但我在这里已经阅读了类似的答案,但我找不到更多的概述。我不熟悉回调,而我正试图了解何时应该使用它们。

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();

4 个答案:

答案 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);

参考callback exaplanation