1

私がこれを持っている場合:

$(SomeID).on({
    click: function () { SomeFunction1(); },
    mouseenter: function () { SomeFunction2(); },
    mouseleave:function () { SomeFunction3(); }
}, '.SomeClass');

私はそれを次のように書き直すことができます

$(SomeID).on({
    click: SomeFunction1,
    mouseenter: SomeFunction2,
    mouseleave: SomeFunction3
}, '.SomeClass');

しかし、次のようなパラメータを渡す必要がある場合はどうなりますか?

$(SomeID).on({
    click: function () { SomeFunction1($(this)); },
    mouseenter: function () { SomeFunction2($(this).index()); },
    mouseleave: function () { SomeFunction3($(this).index()); }
}, '.SomeClass');

代替手段はありますか?

ありがとう。

4

3 に答える 3

2

@Jashwantが言うように、thisとにかく同じことが関数で使用されるので、それはあなたが心配する必要のない1つの値です(あなたの例では)。

必要に応じて説明どおりに行うことができます。静的な値の場合は簡単で、カリー化と呼ばれます。javascriptの例は次のようになります:http ://www.dustindiaz.com/javascript-curry/

于 2012-06-17T09:27:07.557 に答える
1

sの実装を変更して、SomeFunctionパラメーターなしで機能させる必要があります。

たとえば、次の場合:

function SomeFunction2(arg) {
  //do something assuming arg to be $(this).index()
}

あなたはそれをそのように書くことができます:

function SomeFunction2() {
  var arg = $(this).index();
  //do exactly the same
}

3つのコールバックすべてに対してこれを行った後、2番目のコードサンプルを使用してそれらをバインドできます。

于 2012-06-17T09:27:03.263 に答える
1

JavaScript 関数内の意味は、関数が定義thisされたレキシカル スコープに依存しません。this.namegreet

var x = { name: 'World' };
var greet = function() { alert('Hello, ' + this.name); };
x.greet = greet;
x.greet();

次のアラートも「Hello, World!」です。

var x = { name: 'World' };
var y = { name: 'Dude', greet: function() { alert('Hello, ' + this.name); } };
x.greet = y.greet;
x.greet();

舞台裏では、次のようなことが行われています。

var greet = function() { alert('Hello, ' + this.name); };
greet.call({ name: 'World' });

したがって、#2 と #3 のスニペットを安全に混在させることができます。

ところで:

ほとんどの jQuery イベント ハンドラーは、最初のパラメーターとして jQuery イベント オブジェクトへの参照を使用して呼び出されます。そのため、どのようにthis機能するかが難しい場合 (または、同僚一人一人に説明しなければならないのではないかと心配している場合) は、event.delegateTarget代わりにを使用することもできます。のthis

例を参照してください。

$(document).click(function(evt){ alert (evt.delegateTarget === this); });
于 2012-06-17T09:47:09.793 に答える