什么是回调函数?
当前回答
维基百科上的回调页面很好地解释了这一点:
在计算机编程中,回调是对可执行代码或一段可执行代码的引用,作为参数传递给其他代码。这允许较低级别的软件层调用在较高级别的层中定义的子程序(或函数)。
其他回答
回调函数是在满足特定条件时应调用的函数。回调函数不是立即调用,而是在将来的某个时间点调用。
通常,当一个任务正在启动时,它将异步完成(即在调用函数返回后一段时间完成)。
例如,请求网页的函数可能要求其调用方提供回调函数,该回调函数将在网页完成下载时调用。
我相信这种“回调”术语在很多地方被错误地使用了。我的定义大致如下:
回调函数是传递给某人并让他们在某个时间点称之为。
我认为人们只是读了维基定义的第一句话:
回调是对可执行代码的引用,或可执行代码,作为参数传递给其他代码。
我一直在使用很多API,看到了各种糟糕的例子。许多人倾向于将函数指针(对可执行代码的引用)或匿名函数(一段可执行代码)命名为“回调”,如果它们只是函数,为什么需要另一个名称?
实际上,wiki定义中只有第二句话揭示了回调函数和普通函数之间的区别:
这允许较低级别的软件层调用子程序(或函数)。
所以不同的是你将传递给谁,以及你传递的函数将如何被调用。如果您只是定义一个函数并将其传递给另一个函数,然后在该函数体中直接调用它,则不要调用回调。定义中说,传入的函数将由“较低级别”函数调用。
我希望人们能停止在模棱两可的语境中使用这个词,它不能帮助人们更好地理解,只能更糟。
CallAfter将是一个比callback这个愚蠢的名字更好的名字。当或如果某个函数满足条件,则调用另一个函数,即CallAfter函数,即作为参数接收的函数。
与其在函数中硬编码内部函数,不如编写一个函数来接受已经编写的CallAfter函数作为参数。可能会根据接收参数的函数中的代码检测到的状态更改来调用CallAfter。
我在这个问题上已经迟到了13年,但在我自己学习之后,我想我应该在这里再加一个答案,以防有人像我一样困惑。
其他答案总结了“回调是什么?”这一问题的症结所在
它只是一个函数,在完成某个任务时调用另一个函数。
让我感动的是这样的例子:“你做了这个,现在做了那个。”比如,当我自己可以调用一个方法或函数时,为什么我会这样使用它?
所以这里有一个快速、真实的例子,希望它能让某人“点击”。
超伪码
首先,你会遇到的核心问题。。。。
Multithreaded Method(Some arguments)
{
Do fancy multithreaded stuff....
}
Main()
{
Some stuff I wanna do = some tasks
Multhreaded Method(Some stuff I wanna do)
}
如果在没有任何回调的情况下运行该程序,则程序看起来就像是退出了。因为“花式多线程程序”正在另一个进程上运行。
所以你挠挠头想:“见鬼,我怎么知道什么时候完成?”
繁荣。。。回调
IsItDone = false
Callback()
{
print("Hey, I'm done")
IsItDone = true
}
Multithreaded Method(Some arguments, Function callback)
{
Do fancy multithreaded stuff....
}
Main()
{
Some stuff I wanna do = some tasks
Multhreaded Method(Some stuff I wanna do,Callback)
while(!IsItDone)
Wait a bit
}
这100%不是实现它的最佳方式,我只是想给出一个明确的例子。
所以这并不是简单的“回调是什么?”它是“回调是什么,它有什么好处???”
一个重要的使用领域是将一个函数注册为句柄(即回调),然后发送消息/调用某个函数来执行某些工作或处理。现在,处理完成后,被调用的函数将调用我们注册的函数(即,现在回调完成),从而表明处理完成。这个维基百科链接以图形方式解释得很好。