jQuery:为什么使用匿名函数作为参数?

时间:2013-10-26 23:10:39

标签: javascript jquery anonymous-function

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

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

与此相反:

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

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

4 个答案:

答案 0 :(得分:5)

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

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

执行以下操作:

  1. alert作为参数
  2. 来调用"You clicked it."
  3. alert调用(undefined)的结果绑定为#target的点击处理程序。
  4. 换句话说,alert被立即调用,undefined被绑定为事件处理程序,这是没有意义的。

    使用第一个代码段:

    $( "#target" ).click(function() {
      alert( "Handler for .click() called." );
    });
    
    1. 创建匿名函数[alert( "Handler for .click() called." );]
    2. 该表达式(函数)的结果被绑定为事件处理程序
    3. 有关匿名函数的详细信息,请参阅this question

答案 1 :(得分:1)

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

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

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

  

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

那么,你还能怎么做?在JavaScript中表达“一个表达式块”的唯一方式是......你猜对了:函数。

答案 2 :(得分:1)

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

javascript Functions中的

are first class objects。这意味着它们可以作为参数传递。您可以将alert传递给click方法。但是在你的第二个例子中,你没有传递它,你正在调用它(see Doorknob's answer)!

答案 3 :(得分:1)

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