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

匿名関数を使用する理由は、hover イベントが発生するまで hoverState の呼び出しを延期するためです。そこに関数参照がなければ、hoverState を呼び出すことになり、関数呼び出しの結果が hover メソッドのパラメーターになります。別の方法として、名前付き関数を使用することもできますが、それは実際にはあまり良くなく、ある意味では実際には悪いことです。

于 2009-11-03T22:31:58.603 に答える
9

いいえ、それ以外の場合はあなたの呼び出し:

hoverState($("#navbar a").index(this),1)

hover 関数自体の呼び出しと同時に評価されます。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 に答える