jQuery:为什么使用匿名函数作为参数
jQuery: Why use anonymous functions as argument?
在试图同时掌握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.");
执行以下操作:
- 以
"You clicked it."
作为参数调用alert
- 将该
alert
调用的结果(undefined
)绑定为#target
的单击处理程序。
换句话说,alert
被立即调用,undefined
被绑定为事件处理程序,这毫无意义。
而对于第一个代码片段:
$( "#target" ).click(function() {
alert( "Handler for .click() called." );
});
- 创建匿名函数 [
alert( "Handler for .click() called." );
] - 并且该表达式(函数)的结果绑定为事件处理程序
有关匿名函数的详细信息,请参阅此问题。
click
的第一个参数是一个回调函数。 回调函数在单击事件之后执行。
JavaScript 中的函数是第一类对象。 这意味着它们可以作为参数传递。 您可以将alert
传递给click
方法。 但是在你的第二个例子中,你不是在传递它,而是在调用它(见门把手的答案)!
在您的第二个示例中,它实际上会调用带有 undefined
的单击。试试吧:
> alert
function alert() { [native code] }
> alert('test')
undefined
这是因为 alert
函数返回 undefined
,所以您实际上是以 undefined
作为参数调用该方法。
只是为表达式块提供包装器
好吧,你还能怎么做?在 JavaScript 中表达"表达式块"的唯一方法是......你猜对了:函数。
好吧,将函数作为参数传递是JavaScript中非常常见的习语。有时您需要将回调函数传递给另一个函数,例如事件处理程序,并且不需要单独定义它并为其命名。如果你也需要在其他地方调用该函数,那么你用它自己的名称单独定义它,但如果你只需要在一个地方使用它,那么就没有必要给它一个名字。
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 为什么不'我们在javascript中使用函数参数的数据类型
- 使用闭包共享构造函数参数
- 函数参数的值错误
- 当一个重要的构造函数参数丢失时应该发生什么
- 阻止ReSharper将JavaScript函数参数放到新行中
- 根据函数参数将CSS值存储在var中,然后对其进行操作
- 使构造函数参数具有ES6类方法的特权
- 当客户端将两个按钮的javascript函数参数修改为相同时,SQL/PHP会更新多行
- Windows.Networking.EndpointPair构造函数参数
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- 大括号中的Javascript函数参数
- jQuery 无法使用 AJAX 调用访问函数内部的函数参数
- 将JSON字符串转换为函数参数
- eval()读取函数参数有多糟糕
- Javascript不能在一个命令中使用函数参数
- 函数参数在内部不可见,返回新的Promise(函数(resolve,reject).传递给被promise化的函数的
- ES6类构造函数参数
- 是否可以在javascript函数参数列表中调用多个函数