如果我有一大堆这样的代码:
.hover(
function () {
hoverState($("#navbar a").index(this),1);
},
function () {
hoverState($("#navbar a").index(this),-1);
});
有没有办法摆脱匿名函数,只说:
.hover(
hoverState($("#navbar a").index(this),1),
hoverState($("#navbar a").index(this),-1);
);
答案 0 :(得分:9)
匿名函数的原因是将调用推迟到hoverState,直到发生悬停事件。如果没有一些函数引用,你最终会调用hoverState,函数调用的结果将成为hover方法的参数,这肯定不是你想要的。另一种方法是拥有一个命名函数,但实际上并没有更好,在某些方面,实际上更糟糕。
答案 1 :(得分:9)
不,因为否则你的电话:
hoverState($("#navbar a").index(this),1)
将在调用悬停函数本身的同时进行评估。由于Javascript支持闭包和第一类函数,因此您可以创建一个包装函数:
function wrapper(position){
function _f(){
hoverState($("#navbar a").index(this), position);
}
return _f;
}
然后使用:
.hover(
wrapper(1),
wrapper(-1),
)
但这种方法的好处值得怀疑。
答案 2 :(得分:2)
有一种方法可以使用the jLambda plugin做这样的事情。
// Without plugin:
$('.foo').click(
function() {
$(this).hide();
$('p').show();
$('a').width(20);
});
// With plugin:
$('.foo').click($l.hide().$('p').show().$('a').width(20));
答案 3 :(得分:1)
我的回答看起来很愚蠢但是这里......你可以使用简单的函数:}
function hoverStateProxy1() {
hoverState($("#navbar a").index(this),1);
}
function hoverStateProxy2() {
hoverState($("#navbar a").index(this),-1);
}
.hover(hoverStateProxy1, hoverStateProxy2);
只要你传递参考功能就可以了。它可以是匿名的也可以是匿名的。
答案 4 :(得分:0)
您可以使用JavaScript's "Apply" Function。下面是一个来自Prototype.js框架的示例(绑定实现,但如果不在框架内使用它可能会被重命名)。
编辑:已更正,请参阅This Post
if (!Object.bind) {
Function.prototype.bind= function(owner) {
var that= this;
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner,
args.length===0? arguments : arguments.length===0? args :
args.concat(Array.prototype.slice.call(arguments, 0))
);
};
};
}
用法:
.hover(
hoverState.bind(this,$("#navbar a").index(this),1),
hoverState.bind(this,$("#navbar a").index(this),-1)
);