我是一个编程菜鸟,并不太了解回调方法背后的概念。尝试在维基中阅读它并且它超越了我的头脑。有人可以用简单的语言解释一下吗?
答案 0 :(得分:20)
回调是你传递给函数的东西,它告诉它在它的操作中的某个点应该调用它。函数中的代码决定何时调用函数(以及要传递的参数)。通常,您执行此操作的方法是在函数为对象的语言中将函数本身作为“回调函数”传递。在其他语言中,您可能必须传递一种称为“函数指针”(或类似)的特殊事物;或者您可能必须传递函数的名称(然后在运行时查找)。
一个简单的例子,在Python中:
void call_something_three_times(what_to_call, what_to_pass_it):
for i in xrange(3): what_to_call(what_to_pass_it)
# Write "Hi mom" three times, using a callback.
call_something_three_times(sys.stdout.write, "Hi mom\n")
这个例子让我们将重复函数调用的任务与实际调用函数的任务分开。这不是很有用,但它证明了这个概念。
在现实世界中,回调被广泛用于线程库之类的东西,你可以使用回调来调用一些线程创建函数来描述线程将要做的工作。线程创建函数完成了设置线程所需的工作,然后安排新线程调用回调函数。
答案 1 :(得分:11)
维基说:
在计算机编程中,回调是 对可执行代码的引用,或者 一段可执行代码,即 作为参数传递给其他代码。 这允许较低级别的软件 图层调用子程序(或 功能)在更高级别定义 层
一般来说,它是一种机制,用于通知一段代码,即一种方法,在需要时执行哪一段代码,即另一种方法。
回调与以下事实有关:调用函数的客户端指定一个函数,该函数属于客户端代码对要执行的调用函数的责任,并将其作为参数传递。
一个例子是在GUI中。作为参数传递事件发生时要调用的函数(例如按下按钮)和事件
发生此功能被调用
此函数通常由最初为事件注册的对象实现
答案 2 :(得分:5)
回调函数是通过函数指针调用的函数。如果将函数的指针(地址)作为参数传递给另一个函数,当该指针用于调用它所指向的函数时,则表示会进行回调。
为什么要使用回调功能?
回调可用于通知。例如,您需要在应用程序中设置计时器。每次计时器到期时,都必须通知您的申请。但是,时间机制的实现者对您的应用程序一无所知。它只需要一个指向具有给定原型的函数的指针,并且在使用该指针时它会进行回调,通知应用程序有关已发生的事件。实际上,SetTimer()WinAPI使用回调函数来通知计时器已过期(并且,如果没有提供回调函数,它会将消息发布到应用程序的队列中。)
答案 3 :(得分:1)
通常,您提供一个函数作为参数,当某些事情发生时会被调用。
在C代码中,您将传递如下内容:
int (callback *)(void *, long );
表示一个带有两个参数的函数,void *和long,并返回一个int。
对于面向对象的语言,语法有时更简单。例如,您可能能够构造一个回调机制,允许用户传入一个看起来像函数的对象,或者有一个抽象方法(因此包装一个函数)和上下文数据。
现代语言使用术语“委托”来表示函数“模式”。这些可以用作回调。有些语言也使用术语lambda
,它本质上是一个没有名称的函数,通常在代码块中“动态”创建并作为回调传递。
C++11
已将这些引入其标准中。
使用回调的优点是你可以分离出来,即减少/解耦API与调用它,在某种程度上反之亦然,即尽管在一个地方你知道你正在调用API, “处理程序”的要点,它不需要知道它被调用的位置。
例如,您可以拥有一个生成对象的API,然后在生成时“回调”。
答案 4 :(得分:1)
回拨意味着您将代码作为参数传递。例如,想象一个按钮,按下时会显示一个对话框:
Button testBtn;
testBtn.setOnClickListener(new OnClickListener() {
@Override
public void onCLick() {
JOptionPane.showDialog(testBtn, "Test button pressed");
}
}
这里我们告诉按钮执行什么,何时点击。因此,框架将在检测到单击时执行传递的代码。在框架内部有一些代码,如:
void processEvent(Event e) {
if (e.type == Event.CLICK) {
e.getComponent().getOnClickListener().onClick();
}
}
因此,一些基本代码会在适当的事件发生时回调监听器。
PS:Pseudocode在这里,只是描述一下这个想法。
答案 5 :(得分:0)
回调方法是在事件发生时调用的方法
答案 6 :(得分:0)
简单来说,回调实际上是对函数或方法的引用,您可以将其作为参数传递给另一个函数,以便稍后回调。
从上图中,B_reference()
是回调方法。
源代码示例:
>>> def A(A_msg,B_reference):
... # After printing message, method B is called.
... print(A_msg)
... B_reference()
...
>>> def B():
... print("Message from B")
...
>>>
>>> A("Message from A",B)
Message from A
Message from B
>>>
如果你还是不明白它是什么,你可以查看this video: