13

我很难概念化 jQuery 中的回调或钩子到底是什么。它们似乎混为一谈,但我不知道它们之间的区别。

根据我从其他有关回调的帖子中了解到的情况,就像这样,回调只是一个函数 A,您将其传递给另一个函数 B,该函数 B 在 B 完成后调用 A。(这可能是完全错误的,如果是,请纠正我)。

除了声明“你应该使用钩子/回调”之外,我真的对钩子没有任何概念。有些事情让我怀疑他们是否如此相似......

4

2 回答 2

15

你的定义很接近但不够。回调是您传递给另一个函数 B(或对象 B)的函数 A,B 将在适当的点调用该函数。

正如您所描述的,对于某些功能,“适当的点”是在该功能完成之后。

当可以触发回调时,许多函数或对象定义了一组“某些点”或事件。例如,如果您有一个通过 AJAX 定期更新自身的控件,它可能会定义一个在即将更新时发生的事件、一个在更新返回后发生的事件以及一个在显示结果后发生的事件。对于这些事件中的任何一个,您都可以将自定义函数传递给它,该函数应该在该事件发生时调用。

可以调用自定义函数的定义的一组点就是人们所说的“钩子”。它们是您可以将功能挂钩到预构建库的地方。

编辑添加:

OP 要求提供一个简单的钩子示例。

假设我编写了一个函数,该函数接受用户名列表,旨在遍历列表,查找每个人的详细信息,并返回人员对象的填充列表。

也许我想让使用我的函数的程序员能够指定当在我的数据库中找不到用户名时应该发生什么。一个程序员可能希望函数出错,另一个可能希望它忽略丢失的示例,另一个可能希望它在不同的数据库中查找,另一个可能希望它构造一个空的 person 对象。

所以我的函数签名可能类似于

function getPeople( arrayOfUsernames, missingUsernameCallback )

在函数中,每当我遇到在数据中找不到的用户名时,我都会调用

missingUsernameCallback( notFoundUsername );

现在程序员可以像这样调用函数

getPeople( ["adam","betty","charlie"], function(name){ alert("Missing username " + name)} );

每当我遇到丢失的用户名时,我都会调用传递给我的函数。

对于更复杂的情况,我可能需要接受一个包含多个回调函数的对象,因此可以像这样调用它

   getPeople( ["adam","betty","charlie"], 
        {startOfListCallback:      function(){ alert("I'm starting the list")},
         missingUsernameCallback:  function(){ alert("Missing username"!)},
         endOfListCallback:        function(){ alert("I'm at the end of the list") });

等。可能的回调列表将由函数定义,并且应该在 API 文档中(连同可以传递给回调的参数等)。该回调列表是钩子。

于 2011-07-18T15:31:53.853 回答
1

我猜在上下文中你已经看到了“使用人”这个词的意思是回调,这正是你所认为的(在 jQuery 的情况下,钩子和回调是一回事)。

例如,jQuery 的 animate() 函数的回调将在动画完成后立即执行。

一些内置函数和其他 jQuery 插件可能会为不同的执行阶段定义多个回调。例如,一个为用户显示弹出框的插件可能有一个回调,当用户点击一个链接以显示该框时,但在该框实际显示之前(此回调可用于存储一些数据,实际弹出框将需要,例如)。当盒子再次关闭时,相同的弹出函数也可能执行一个回调函数——这个回调可以用来改变页面,或者保存一些数据。

于 2011-07-18T15:29:41.027 回答