什么是回调函数?
当前回答
让我们保持简单。什么是回调函数?
抛物线和类比示例
我有一个秘书。每天我都会让她:(I)把公司的邮件寄到邮局,等她寄完之后,再做:(ii)我在那些便笺上为她写的任何任务。
现在,便笺上的任务是什么?任务每天都不同。
假设在这一天,我要求她打印一些文件。所以我把它写在便笺上,然后把它和她需要寄的邮件一起钉在她的桌子上。
总而言之:
首先,她需要放下邮件完成后,她需要立即打印一些文件。
回调函数是第二项任务:打印这些文档。因为这是在邮件投递后完成的,同时也是因为通知她打印文档的便笺和她需要邮寄的邮件一起给了她。
现在让我们将其与编程词汇联系起来
本例中的方法名为:DropOffMail。回调函数是:PrintOffDocuments。PrintOffDocuments是回调函数,因为我们希望秘书只有在DropOffMail运行后才能这样做。因此,我会将PrintOffDocuments作为“参数”传递给DropOffMail方法。这是一个重要的点。
仅此而已,没什么了。我希望这能为你澄清——如果没有,请发表评论,我会尽力澄清。
其他回答
回调函数是您传递(作为引用或指针)到某个函数或对象的函数。此函数或对象将在以后的任何时候(可能多次)出于任何目的调用此函数:
通知任务结束请求两个项目之间的比较(如在c qsort()中)报告流程的进度通知事件委托对象的初始化授权绘制区域
...
因此,将回调描述为在另一个函数或任务结束时调用的函数过于简单(即使这是一个常见的用例)。
CallAfter将是一个比callback这个愚蠢的名字更好的名字。当或如果某个函数满足条件,则调用另一个函数,即CallAfter函数,即作为参数接收的函数。
与其在函数中硬编码内部函数,不如编写一个函数来接受已经编写的CallAfter函数作为参数。可能会根据接收参数的函数中的代码检测到的状态更改来调用CallAfter。
维基百科上的回调页面很好地解释了这一点:
在计算机编程中,回调是对可执行代码或一段可执行代码的引用,作为参数传递给其他代码。这允许较低级别的软件层调用在较高级别的层中定义的子程序(或函数)。
让我们保持简单。什么是回调函数?
抛物线和类比示例
我有一个秘书。每天我都会让她:(I)把公司的邮件寄到邮局,等她寄完之后,再做:(ii)我在那些便笺上为她写的任何任务。
现在,便笺上的任务是什么?任务每天都不同。
假设在这一天,我要求她打印一些文件。所以我把它写在便笺上,然后把它和她需要寄的邮件一起钉在她的桌子上。
总而言之:
首先,她需要放下邮件完成后,她需要立即打印一些文件。
回调函数是第二项任务:打印这些文档。因为这是在邮件投递后完成的,同时也是因为通知她打印文档的便笺和她需要邮寄的邮件一起给了她。
现在让我们将其与编程词汇联系起来
本例中的方法名为:DropOffMail。回调函数是:PrintOffDocuments。PrintOffDocuments是回调函数,因为我们希望秘书只有在DropOffMail运行后才能这样做。因此,我会将PrintOffDocuments作为“参数”传递给DropOffMail方法。这是一个重要的点。
仅此而已,没什么了。我希望这能为你澄清——如果没有,请发表评论,我会尽力澄清。
开发人员常常因为该死的东西的名称而被什么是回调弄糊涂。
回调函数是一个函数,它是:
可由其他功能访问,以及在第一个函数完成后调用
想象回调函数如何工作的一个很好的方法是,它是一个“在传入函数的后面调用”的函数。
也许一个更好的名称是“call after”函数。
这个构造对于异步行为非常有用,在异步行为中,我们希望在前一个事件完成时发生活动。
伪代码:
// A function which accepts another function as an argument
// (and will automatically invoke that function when it completes - note that there is no explicit call to callbackFunction)
funct printANumber(int number, funct callbackFunction) {
printout("The number you provided is: " + number);
}
// a function which we will use in a driver function as a callback function
funct printFinishMessage() {
printout("I have finished printing numbers.");
}
// Driver method
funct event() {
printANumber(6, printFinishMessage);
}
调用event()时的结果:
The number you provided is: 6
I have finished printing numbers.
这里的输出顺序很重要。由于回调函数是在后面调用的,所以“我已经完成了数字打印”是最后一个,而不是第一个。
回调是所谓的,因为它们与指针语言一起使用。如果你不使用其中一个,就不要为“回调”这个名字而烦恼。只需理解,它只是一个名称,用来描述作为另一个方法的参数提供的方法,这样当调用父方法(无论什么条件,如按钮单击、计时器滴答声等)且其方法体完成时,就会调用回调函数。
某些语言支持支持多个回调函数参数的构造,并根据父函数的完成方式进行调用(即,在父函数成功完成的情况下调用一个回调,在父功能抛出特定错误的情况下,调用另一个回调等)。