2013-10-26 51 views
1

为了同时掌握jQuery和JavaScript的一些基础知识,我对jQuery为什么需要一个匿名函数作为参数有些困惑。就像这样:jQuery:为什么使用匿名函数作为参数?

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

与此相反:

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

在jQuery的自己"101" guide,他们指出,“传递函数作为参数是jQuery中一种极为常见的成语。”但他们似乎没有解释为什么。只是为表达式块提供包装,或者(我怀疑)不仅仅是这些?

+0

你的第二个语法错误(_SyntaxError:missing)在参数list_)之后 - 你是指'$(“#target”)。click(alert,“You clicked。”);'? –

+1

'只是为表达式块提供一个包装器吗? - 你知道任何其他有效的方法来做到这一点,而不使用函数吗? – raina77ow

+0

我的问题的一部分是,如果它只是*为此。或者说,除了包装表达式以外,还有什么别的方法可以使用匿名函数。 – Gregir

回答

1

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

Functions in javascript are first class objects。这意味着它们可以作为参数传递。您可以将alert传递给click方法。但在你的第二个例子中,你没有通过它,你打电话给它(see Doorknob's answer)!

1

在你的第二个例子中,它实际上会调用点击undefined。试试看:

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

这是因为alert函数返回undefined,所以你实际上调用具有undefined作为参数的方法。

Is it just to provide a wrapper for a block of expressions

那么,你会怎么做呢? 只有在JavaScript中表达“一段表达式”的方法是......你猜对了:函数。

+0

对。我明白这是什么功能。我想知道这是否仅仅是出于这个原因,或者更多。 – Gregir

1

那么,传递函数作为参数是一个非常普遍的成语,在JavaScript。有时您需要将回调函数传递给另一个函数,例如事件处理函数,并且不需要单独定义它并为其命名。如果你需要在别的地方调用这个函数,那么你用它自己的名字分别定义它,但是如果你只需要在一个地方使用它,那么就没有必要给它一个名字。

+1

感谢您的额外信息:匿名与命名。 – Gregir

4

为了回答您的具体问题,其原因是因为这段代码:

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

执行以下操作:

  1. 呼叫alert"You clicked it."作为参数
  2. 绑定alert结果请致电(即undefined)作为#target的点击处理程序。

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

而与所述第一代码片断:

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

有关匿名功能的更多信息,请参见this question

相关问题