什么是回调函数?


当前回答

我相信这种“回调”术语在很多地方被错误地使用了。我的定义大致如下:

回调函数是传递给某人并让他们在某个时间点称之为。

我认为人们只是读了维基定义的第一句话:

回调是对可执行代码的引用,或可执行代码,作为参数传递给其他代码。

我一直在使用很多API,看到了各种糟糕的例子。许多人倾向于将函数指针(对可执行代码的引用)或匿名函数(一段可执行代码)命名为“回调”,如果它们只是函数,为什么需要另一个名称?

实际上,wiki定义中只有第二句话揭示了回调函数和普通函数之间的区别:

这允许较低级别的软件层调用子程序(或函数)。

所以不同的是你将传递给谁,以及你传递的函数将如何被调用。如果您只是定义一个函数并将其传递给另一个函数,然后在该函数体中直接调用它,则不要调用回调。定义中说,传入的函数将由“较低级别”函数调用。

我希望人们能停止在模棱两可的语境中使用这个词,它不能帮助人们更好地理解,只能更糟。

其他回答

回调函数是在满足特定条件时应调用的函数。回调函数不是立即调用,而是在将来的某个时间点调用。

通常,当一个任务正在启动时,它将异步完成(即在调用函数返回后一段时间完成)。

例如,请求网页的函数可能要求其调用方提供回调函数,该回调函数将在网页完成下载时调用。

一个重要的使用领域是将一个函数注册为句柄(即回调),然后发送消息/调用某个函数来执行某些工作或处理。现在,处理完成后,被调用的函数将调用我们注册的函数(即,现在回调完成),从而表明处理完成。这个维基百科链接以图形方式解释得很好。

假设我们有一个函数sort(int*arraytobesorted,void(*algorithm selected)(void)),它可以接受一个函数指针作为其参数,可以在sort()实现的某个点使用。然后,这里选择的函数指针算法所处理的代码被称为回调函数。

我们可以选择任何算法,比如:

  1.    algorithmchosen = bubblesort
  2.    algorithmchosen = heapsort
  3.    algorithmchosen = mergesort   ...

比如说,已经用原型实现了:

  1.   `void bubblesort(void)`
  2.   `void heapsort(void)`
  3.   `void mergesort(void)`   ...

这是用于实现面向对象编程中的多态性的概念

回叫最容易用电话系统来描述。功能调用类似于打电话给某人,问她问题,得到答案,然后挂断电话;添加回拨会改变类比,这样在问她一个问题后,你也可以给她你的名字和电话号码,这样她就可以给你回拨答案。

--Paul Jakubik,“C++中的回调实现”

回调函数作为参数传递给另一个函数的函数。

function test_function(){       
 alert("Hello world");  
} 

setTimeout(test_function, 2000);

注意:在上面的示例中,test_function用作setTimeout函数的参数。