1

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

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

5 回答 5

9

匿名函数的原因是推迟对 hoverState 的调用,直到悬停事件发生。如果没有一些函数引用,你最终会调用 hoverState 并且函数调用的结果成为悬停方法的参数,这肯定不是你想要的。另一种选择是有一个命名函数,但这并没有更好,在某些方面,实际上更糟。

于 2009-11-03T22:31:58.603 回答
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),
)

但这种方法的收益是值得怀疑的。

于 2009-11-03T22:36:08.993 回答
2

有一种方法可以使用jLambda 插件来做这样的事情。

// Without plugin:
$('.foo').click(
            function() {
                $(this).hide();
                $('p').show();
                $('a').width(20);
            });

// With plugin:
$('.foo').click($l.hide().$('p').show().$('a').width(20));
于 2009-11-04T01:32:27.440 回答
1

我的回答可能看起来很愚蠢,但在这里......你可以使用简单的功能:}

function hoverStateProxy1() {
        hoverState($("#navbar a").index(this),1);
}


function hoverStateProxy2() {
        hoverState($("#navbar a").index(this),-1);
}

.hover(hoverStateProxy1, hoverStateProxy2);

只要您传递对函数的引用,就可以了。它可以是匿名的,也可以不是。

于 2009-11-03T22:36:36.173 回答
0

您可以使用JavaScript 的“应用”函数。这是一个取自 Prototype.js 框架的示例(绑定实现,尽管如果不在框架内使用它可能应该重命名)。

编辑:更正,见这篇文章

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)
);
于 2009-11-03T23:05:07.130 回答