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

jQuery: Why use anonymous functions as argument?

本文关键字:函数 参数 为什么 jQuery      更新时间:2023-09-26

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

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

与此相反:

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

在jQuery自己的"101"指南中,他们指出"将函数作为参数传递是jQuery中非常常见的习语。但他们似乎没有解释为什么。只是为表达式块提供包装器,还是(我怀疑)远不止于此?

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

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

执行以下操作:

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

换句话说,alert 被立即调用,undefined被绑定为事件处理程序,这毫无意义。

而对于第一个代码片段:

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

有关匿名函数的详细信息,请参阅此问题。

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

JavaScript 中的函数是第一类对象。 这意味着它们可以作为参数传递。 您可以将alert传递给click方法。 但是在你的第二个例子中,你不是在传递它,而是在调用它(见门把手的答案)!

在您的第二个示例中,它实际上会调用带有 undefined 的单击。试试吧:

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

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

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

好吧,你还能怎么做?在 JavaScript 中表达"表达式块"的唯一方法是......你猜对了:函数。

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