事件处理程序和回调函数之间有什么区别?
答案 0 :(得分:43)
回调是您作为参数传递给另一个过程的过程。接收参数的过程可以调用它,或者共享它,以便系统中的其他一些过程可以调用它。
事件处理程序是事件发生时调用的过程。它可以是一个回调。
答案 1 :(得分:30)
事件处理程序是一种回调。只要事件发生就会调用它。该术语通常用于用户界面,其中事件是移动鼠标,点击某些内容等等。
答案 2 :(得分:17)
一般来说,'回调'是在检测过程的控制之下。
因此,当告诉GUI管理器“按下此按钮时调用myaction
”,GUI管理器会在按下按钮时调用该操作。
事件处理程序在一步操作中被删除。 GUI管理器配置为将消息发送到事件处理程序。您告诉事件管理器按钮按下由myaction
程序处理。当按下按钮时,GUI管理器将消息放在事件处理程序队列上并继续GUI管理,事件处理程序从队列中获取消息,看到它是按钮按下,启动myaction
程序,并继续处理下一个事件。通常,myaction
程序将作为独立线程运行,甚至是单独的进程。
虽然“事件处理程序”模式更复杂,但它更强大,并且在操作失败时不太可能挂起。它还可以提供更具响应性的GUI。
答案 3 :(得分:10)
回调(来自维基百科):“作为参数传递给其他代码的可执行代码”。
事件处理程序(同样来自维基百科):“异步回调子程序,用于处理程序中收到的输入”。
这恰好是我一直理解的方式:事件处理程序是一种非常特殊的回调类型。
答案 4 :(得分:10)
这个问题很老但我发现MSDN的链接非常有趣。我希望遇到这个问题的其他任何人都能从这个链接中获得一些东西。
答案 5 :(得分:8)
事件 - 想想服务器(员工)和客户(老板)。一个员工可以有很多老板。员工在完成任务时提出事件,并且老板可能决定是否听取员工事件。员工是出版商,老板是订户。
回调 - Boss特意要求员工完成任务,在完成任务结束时,Boss希望得到通知。员工将确保在任务完成时,他只通知所要求的老板,而不是所有老板。如果部分工作完成,员工将不会通知Boss。只有在完成所有任务后才会完成。只有一位老板要求提供信息,员工只将答复发布给一位老板。
答案 6 :(得分:4)
这方面的另一个方面是事件描述了过去发生的事情,而事件发生时经常使用回调。
当事件发生时,您会被告知事情已经发生。使用回调时,系统会要求您参与回复。
库或框架可能会发出事件,让您知道发生了什么。框架为您提供了插入代码的点(可能作为回调),以便您可以积极参与流程。
问题的一部分是事件,回调是指技术性的mcehanism以及更抽象的过程。
答案 7 :(得分:1)
var server = require('http').createServer(function(req, res){/* your code */});
createServer
是库定义的函数,它确保检测过程调用正确的回调,在本例中为function(req, res){/* your code */}
因此需要实现回调机制,这解决了这两个问题:
因此,对于多次发生的事件,事件循环或事件处理程序成为实现回调的方式,,而原始回调仍然是首选事件的首选,因为您并不是真正的任务检测过程并不需要为一个事件设置事件循环,因为它效率不高。
答案 8 :(得分:1)
底层机制类似,但语义不同。回调和事件处理程序都称为异步。
回调函数通常从调用程序例程显式传递,以请求一些信息。一段时间后返回信息,作为参数传递回被调用者的回调。此时,调用例程完成其业务。通常,回调是一个闭包 - 在语法例程中语法化,通常是未命名的(匿名)。它有点像下面的javascript:
function caller() {
someLibrary.getMeSomething(arg1, arg2, function(returnedData) {
// this is the callback which will do something with returnedData
});
}
因此callee(someLibrary.getMeSomething)被赋予一个匿名回调函数,一段时间后,这个函数被returnData调用。回调就像是单个接收器的单次事件。
事件处理程序也被“回调”,但通常它们会在很长一段时间内用于多个事件,例如鼠标点击,网络事件等。此外,多个对象可能对同一事件感兴趣。出于这些原因,您通常会“订阅”或“注册”设置代码中的事件(如对象初始化),事件处理程序通常是命名方法。通常,每个事件类型都被标识为常量或字符串。
所以在Python中它可能看起来像:
class MyUIClass:
def __init__(self):
someUILib.register(someUILib.events.MOUSE_CLICK, self.my_mouse_click_handler);
def my_mouse_click_handler(self, eventInfo):
# do something with event
if eventInfo.x < 100:
print 'You clicked in the margin'
答案 9 :(得分:0)
我喜欢这些答案之间的差异。
我将从中得出结论,从术语的角度来看,事件和回调是可以互换的。它们在特定编程语言或框架中的含义有所不同,因为任何平台都倾向于选择自己喜欢的术语。
答案 10 :(得分:0)
回调是作为参数传递给另一个函数(方法)的函数(方法)。接收参数的函数可以调用它,也可以共享它,以便系统中的其他函数可以调用它。
事件处理程序是事件发生时调用的函数(方法)。可以是回调。
答案 11 :(得分:0)
事件具有特殊功能,例如冒泡等。如果您不需要这些功能,那么只需使用回调即可。
答案 12 :(得分:-1)
回调是要求另一个函数做业务操作并发送结果,而事件不是,而是要求移交控制权,以便我们只能处理业务操作。
例如:按钮点击是事件(我们在点击按钮时进行业务操作)。由于 forEach 方法正在执行业务操作并提供结果,因此在回调中循环集合。
答案 13 :(得分:-3)
事件处理程序是系统的回调。