有什么办法可以避免在jQuery中使用匿名函数?

时间:2009-11-03 22:27:28

标签: javascript jquery anonymous-function

如果我有一大堆这样的代码:

.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);
);

5 个答案:

答案 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)
);