钩和回调之间有什么区别?

问题描述 投票:29回答:4

通过阅读一些文本,尤其是有关委托的iOS文档,所有协议方法都称为hook,这是自定义委托对象需要实现的。但是,还有一些其他书籍,将这些hook命名为callback,它们之间有什么区别?它们只是名称不同但机制相同吗?除了Obj-C,其他一些编程语言(例如C)也得到了hook,与Obj-C的情况相同?

callback hook
4个回答
29
投票

这里的术语有点模糊。通常,这两种方法都试图获得相似的结果。

通常,回调是您在处理流程中的适当时间向要注册的API注册的函数(或委托)(例如,通知您处理处于某个阶段)

传统上,

A hook表示一些更通用的名称,用于修改对API的调用(例如,修改传递的参数,监视调用的函数)。从这个意义上讲,它通常比诸如Java之类的高级语言所能达到的水平低得多。

iOS的上下文中,单词hook与上面的callback完全相同]


12
投票

这两个术语非常相似,有时可以互换使用。钩子是库中的一个选项,用户代码可以链接函数来更改库的行为。库函数无需与用户代码并发运行;就像在析构函数中一样。

回调是钩子的一种特定类型,用户代码将在该钩子上启动库调用,通常是I / O调用或GUI调用,这会将控制权交给内核或GUI子系统。然后,控制过程会在中断或信号上“回调”用户代码,以便用户代码可以提供处理程序。

从历史上看,我已经看到钩子用于中断处理程序,而回调函数则用于GUI事件处理程序。我还看到在例程要进行静态链接时使用了钩子,而在动态代码中使用了回调。


7
投票

让我用Java语言回答。在Javascript中,全部使用callbackshooksevents。按此顺序,它们分别是比其他概念更高级的概念。

不幸的是,它们经常使用不当,导致混乱。

回调

从控制流的角度来看,callback是通常作为参数给出的函数,在从函数返回之前要执行。

通常在异步情况下需要等待I / O时使用(例如HTTP请求,文件读取,数据库查询等)。您不想等待同步while循环,因此可以同时执行其他功能。

[当您获取数据时,您(永久)放弃控制并使用结果调用回调。

function myFunc(someArg, callback) {
    // ...
    callback(error, result);
}

因为回调函数可能是尚未执行的某些代码,并且您不知道调用堆栈中函数的上方,所以通常不抛出错误,而是将错误作为参数传递给回调。有错误优先结果优先回调约定。

[在Javascript世界中,大多数回调已由Promises取代,自ES2017 +起,您可以直接使用async/await摆脱富含回调的意大利面条代码,并使异步控制流看起来像是同步的。

有时,在特殊的级联控制流中,您在函数中间运行回调。例如。在async/awaitKoa (web server) middleware中运行Redux middleware,在堆栈中的所有其他中间件都运行完之后返回next()

挂钩

钩子并不是一个明确定义的术语,但是在Javascript实践中,当您希望客户端(API /库用户,子类等)在控制流中定义明确的位置采取可选操作时,会提供钩子。

因此,钩子可能是您在某点调用的某些函数(例如,自变量或类方法),例如在数据库更新期间:

data = beforeUpdate(data);

// ...update

afterUpdate(result);

通常,重点是:

  • 挂钩可以是可选的
  • 通常等待钩子,即它们在那里修改某些数据
  • 每个钩子最多调用一个函数(与事件相反)
  • React在其Hooks API中使用了钩子,并且它们-引用其定义-“是使您可以“钩住” React状态和生命周期功能的函数”,即,它们使您可以更改React状态并分别运行自定义函数状态某些部分发生变化的时间。

事件

在Javascript中,事件是在特定时间emited,并且客户端可以订阅它们。事件发生时调用的函数称为listeners-或为了增加混淆而称为callbacks。为此,我宁愿避开“回调”一词,而改为使用“监听器”一词。

这也是通用的OOP模式。

[前端有一个事件的DOM interface,在node.js中,您有EventEmitter接口。在ReactiveX中实现了复杂的异步版本。

事件属性:

  • 可能为同一事件订阅(执行)多个侦听器/回调。
  • 它们通常不接收回调,仅接收一些事件信息并同步运行
  • 通常,与钩子不同,>它们不是用于在事件发射器的控制流中修改数据。发射器不在乎“是否有人在听”。它只是使用事件数据调用侦听器,然后立即继续。
  • 示例:当数据流开始或结束,用户单击按钮或修改输入字段时发生事件。

已经有两个很好的答案,但是[[我想再提供一个证据,术语“ hook”和“ callback”是相同的,并且可以互换使用

:FreeRTOS支持术语“ hook”,但可以识别当他们说:“ callback”时
空闲任务可以选择调用应用程序定义的

hook(或回调)

函数-空闲钩子。滴答中断可以有选择地调用应用程序定义的

hook(或回调)

函数-滴答钩。
由heap_1.c,heap_2.c,heap_3.c,heap_4.c和heap_5.c实现的内存分配方案可以选择包含malloc()故障

hook(或回调)

函数,可以将其配置为如果pvPortMalloc()返回NULL,则会被调用。
来源:https://www.freertos.org/a00016.html

3
投票

已经有两个很好的答案,但是[[我想再提供一个证据,术语“ hook”和“ callback”是相同的,并且可以互换使用

© www.soinside.com 2019 - 2024. All rights reserved.