什么是jQuery钩子和回调?

sti*_*man 11 jquery jquery-callback

我很难概念化jQuery中究竟回调或挂钩的内容.他们似乎被混为一谈,但我不知道他们之间的区别.

根据我对其他关于回调的帖子的理解,像这样,回调只是一个函数A,你传递给另一个函数B,一旦B完成就调用A. (这可能是完全错误的,如果是这样,请纠正我).

除了声明"你应该使用钩子/回调"之外,我真的对钩子没有任何想法.有些东西让我怀疑他们是那么相似......

Jac*_*son 13

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

对于某些函数,"适当的点"是在该函数完成之后,如您所述.

当可以触发回调时,许多函数或对象定义一组"特定点"或事件.例如,如果您有通过AJAX定期更新自身的控制,它可以定义,当它要更新发生的事件,该更新后,发生的一个事件,结果已经显示后发生的事件.对于任何这些事件,您可以将其传递给应该在该事件发生时调用的自定义函数.

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

编辑添加:

OP要求一个简单的钩子示例.

假设我编写了一个函数,它接受一个用户名列表,旨在浏览列表,查找每个人的详细信息,并返回一个填充的人物对象列表.

也许我想让程序员利用我的函数来指定在我的数据库中找不到用户名时会发生什么.一个程序员可能希望函数出错,另一个可能希望它只是忽略丢失的示例,另一个可能希望它在另一个数据库中查找,另一个可能希望它构造一个空人对象.

所以我的函数签名可能是这样的

function getPeople( arrayOfUsernames, missingUsernameCallback )
Run Code Online (Sandbox Code Playgroud)

在函数内,每当我找到一个我在数据中找不到的用户名时,我就会打电话

missingUsernameCallback( notFoundUsername );
Run Code Online (Sandbox Code Playgroud)

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

getPeople( ["adam","betty","charlie"], function(name){ alert("Missing username " + name)} );
Run Code Online (Sandbox Code Playgroud)

每当我点击丢失的用户名时,我都会调用传递给我的函数.

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

   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") });
Run Code Online (Sandbox Code Playgroud)

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