在尝试同时掌握jQuery和JavaScript的一些基础知识时,我有点困惑为什么jQuery将匿名函数作为参数。像这样:
$( "#target" ).click(function() {
alert( "Handler for .click() called." );
});
与此相反:
$( "#target" ).click(alert("You clicked it."));
在jQuery自己的"101" guide中,他们指出“将函数作为参数传递是jQuery中非常常见的习惯用法。”但他们似乎没有解释原因。它只是为一个表达式块提供一个包装器,或者(我怀疑)远不止于此?
答案 0 :(得分:5)
要回答您的具体问题,原因是因为此代码:
$( "#target" ).click(alert("You clicked it.");
执行以下操作:
alert
作为参数"You clicked it."
alert
调用(undefined
)的结果绑定为#target
的点击处理程序。换句话说,alert
被立即调用,undefined
被绑定为事件处理程序,这是没有意义的。
使用第一个代码段:
$( "#target" ).click(function() {
alert( "Handler for .click() called." );
});
alert( "Handler for .click() called." );
] 有关匿名函数的详细信息,请参阅this question。
答案 1 :(得分:1)
在您的第二个示例中,它实际上会使用undefined
调用click。试试吧:
> alert
function alert() { [native code] }
> alert('test')
undefined
这是因为alert
函数返回undefined
,因此您实际上是以undefined
为参数调用方法。
只是为表达式块提供包装器
那么,你还能怎么做?在JavaScript中表达“一个表达式块”的唯一方式是......你猜对了:函数。
答案 2 :(得分:1)
click
的第一个参数是回调函数。点击事件后执行回调函数。
are first class objects。这意味着它们可以作为参数传递。您可以将alert
传递给click
方法。但是在你的第二个例子中,你没有传递它,你正在调用它(see Doorknob's answer)!
答案 3 :(得分:1)
好吧,将函数作为参数传递是 JavaScript 中非常常见的习惯用语。有时您需要将回调函数传递给另一个函数,例如事件处理程序,并且您不需要单独定义它并为其命名。如果您还需要在其他地方调用该函数,那么您可以使用自己的名称单独定义它,但如果只在一个地方需要它,则无需为其命名。