正如其他几个人所指出的,您必须使用柯里化或绑定来将值传递给函数。在您编写此代码的示例中:
$('.myClass').hover(onMouseOver(), onMouseOut());
您实际上是在该行立即调用 onMouseOver() 和 onMouseOut() 方法,而不是在鼠标实际移出或移出元素时;你写的相当于写这个:
var mouseOverResult = onMouseOver();
var mouseOutResult = onMouseOut();
$('.myClass').hover(mouseOverResult, mouseOutResult);
这绝对不是你想要的。
jQuery 只能理解形式为 的函数function(event)
,因此如果您想要更多参数或其他参数,则必须使用柯里化来获取它们。柯里化(以设计该概念的数学教授的名字命名)可以被认为是创建一个新函数,其中您要传递的值在其中“预先绑定”。
因此,假设您有一个foo
想要传递给onMouseOver
处理程序的变量,如下所示:
功能 onMouseOver(foo) {
...
}
...
var foo = "你好,世界";
$('myClass').hover(...);
为了能够传递该值,您需要另一个将其包装起来的函数,foo
以及onMouseOver
带有 jQuery 可以使用的函数签名的函数。你这样做:
功能 onMouseOver(foo) {
...
}
...
var foo = "你好,世界";
var curriedOnMouseOver = 函数(事件){
onMouseOver(foo);
};
$('myClass').hover(curriedOnMouseOver);
hover()
正如其他几个人所建议的那样,您可以通过在调用中创建 curried 闭包来避免额外的变量声明:
功能 onMouseOver(foo) {
...
}
...
var foo = "你好,世界";
$('myClass').hover(函数(事件) {
onMouseOver(foo);
});
上面的这个例子还展示了如何将事件传递给你的函数,只需向它添加更多参数:
函数 onMouseOver(事件, foo, bar) {
...
}
...
var foo = "你好,世界";
var bar = "再见,世界";
$('myClass').hover(函数(事件) {
onMouseOver(event, foo, bar);
});
JavaScript 的函数 --- 或闭包--- 是非常强大的工具,值得你花时间学习一些你可以用它们做的事情,比如这些例子。