什么是回调函数?
当前回答
我相信这种“回调”术语在很多地方被错误地使用了。我的定义大致如下:
回调函数是传递给某人并让他们在某个时间点称之为。
我认为人们只是读了维基定义的第一句话:
回调是对可执行代码的引用,或可执行代码,作为参数传递给其他代码。
我一直在使用很多API,看到了各种糟糕的例子。许多人倾向于将函数指针(对可执行代码的引用)或匿名函数(一段可执行代码)命名为“回调”,如果它们只是函数,为什么需要另一个名称?
实际上,wiki定义中只有第二句话揭示了回调函数和普通函数之间的区别:
这允许较低级别的软件层调用子程序(或函数)。
所以不同的是你将传递给谁,以及你传递的函数将如何被调用。如果您只是定义一个函数并将其传递给另一个函数,然后在该函数体中直接调用它,则不要调用回调。定义中说,传入的函数将由“较低级别”函数调用。
我希望人们能停止在模棱两可的语境中使用这个词,它不能帮助人们更好地理解,只能更糟。
其他回答
让我们保持简单。什么是回调函数?
抛物线和类比示例
我有一个秘书。每天我都会让她:(I)把公司的邮件寄到邮局,等她寄完之后,再做:(ii)我在那些便笺上为她写的任何任务。
现在,便笺上的任务是什么?任务每天都不同。
假设在这一天,我要求她打印一些文件。所以我把它写在便笺上,然后把它和她需要寄的邮件一起钉在她的桌子上。
总而言之:
首先,她需要放下邮件完成后,她需要立即打印一些文件。
回调函数是第二项任务:打印这些文档。因为这是在邮件投递后完成的,同时也是因为通知她打印文档的便笺和她需要邮寄的邮件一起给了她。
现在让我们将其与编程词汇联系起来
本例中的方法名为:DropOffMail。回调函数是:PrintOffDocuments。PrintOffDocuments是回调函数,因为我们希望秘书只有在DropOffMail运行后才能这样做。因此,我会将PrintOffDocuments作为“参数”传递给DropOffMail方法。这是一个重要的点。
仅此而已,没什么了。我希望这能为你澄清——如果没有,请发表评论,我会尽力澄清。
回叫最容易用电话系统来描述。功能调用类似于打电话给某人,问她问题,得到答案,然后挂断电话;添加回拨会改变类比,这样在问她一个问题后,你也可以给她你的名字和电话号码,这样她就可以给你回拨答案。
--Paul Jakubik,“C++中的回调实现”
一个重要的使用领域是将一个函数注册为句柄(即回调),然后发送消息/调用某个函数来执行某些工作或处理。现在,处理完成后,被调用的函数将调用我们注册的函数(即,现在回调完成),从而表明处理完成。这个维基百科链接以图形方式解释得很好。
这个问题的简单答案是回调函数是通过函数指针调用的函数。如果您将一个函数的指针(地址)作为参数传递给另一个函数,则当该指针用于调用它所指向的函数时,称为进行了回调
回调函数是您指定给现有函数/方法的函数,在操作完成时调用,需要额外处理等。
例如,在Javascript中,或者更具体地说,在jQuery中,可以指定在动画完成时调用的回调参数。
在PHP中,preg_replace_callback()函数允许您提供一个在正则表达式匹配时调用的函数,将匹配的字符串作为参数传递。