1

在尝试同时掌握 jQuery 和 JavaScript 的一些基础知识时,我有点困惑为什么 jQuery 将匿名函数作为参数。像这样:

$( "#target" ).click(function() {
  alert( "Handler for .click() called." );
});

与此相反:

$( "#target" ).click(alert("You clicked it."));

在 jQuery 自己的“101”指南中,他们指出“将函数作为参数传递是 jQuery 中极为常见的习惯用法”。但他们似乎没有解释原因。它只是为一个表达式块提供一个包装器,还是(我怀疑)远不止这些?

4

4 回答 4

5

要回答您的具体问题,原因是因为此代码:

$( "#target" ).click(alert("You clicked it.");

执行以下操作:

  1. alert使用"You clicked it."as 参数调用
  2. 将该调用的结果alert(即)绑定undefined为 的单击处理程序#target

换句话说,alert立即调用并undefined绑定为事件处理程序,这没有任何意义。

而对于第一个代码片段:

$( "#target" ).click(function() {
  alert( "Handler for .click() called." );
});
  1. 创建了一个匿名函数 [ alert( "Handler for .click() called." );]
  2. 并且该表达式(函数)的结果被绑定为事件处理程序

有关匿名函数的更多信息,请参阅此问题

于 2013-10-26T23:17:13.950 回答
1

在您的第二个示例中,它实际上会调用 click with undefined。试试看:

> alert
function alert() { [native code] }
> alert('test')
undefined

这是因为alert函数返回undefined,所以您实际上是在调用该方法undefined作为参数。

是否只是为一个表达式块提供一个包装器

好吧,否则你会怎么做?在 JavaScript 中表达“表达式块”的唯一方法是……你猜对了:函数。

于 2013-10-26T23:13:48.117 回答
1

第一个参数click是回调函数。点击事件后执行回调函数。

javascript中的函数是一流的对象。这意味着它们可以作为参数传递。您可以传递alert给该click方法。但是在您的第二个示例中,您没有通过它,而是在调用它(请参见 Doorknob 的答案)!

于 2013-10-26T23:14:08.510 回答
1

好吧,将函数作为参数传递是JavaScript中非常常见的习惯用法。有时您需要将回调函数传递给另一个函数,例如事件处理程序,并且您不需要单独定义它并为其命名。如果您还需要在其他地方调用该函数,那么您可以使用自己的名称单独定义它,但如果您只需要在一个地方使用它,则无需为其命名。

于 2013-10-26T23:15:06.333 回答