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无论如何都会在函数中使用相同的值,所以这是您不需要担心的一个值(在您的示例中)。

请注意,如果需要,您可以按照您的描述进行操作,静态值很容易,并且称为currying。一个 javascript 示例是:http ://www.dustindiaz.com/javascript-curry/

于 2012-06-17T09:27:07.557 回答
1

您应该修改SomeFunctions 的实现以使它们在没有参数的情况下工作。

例如,如果您有:

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

你可以这样写:

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

在对所有三个回调执行此操作后,您可以使用第二个代码示例来绑定它们。

于 2012-06-17T09:27:03.263 回答
1

javascript函数内部的含义this不依赖于定义函数的词法范围——例如,以下警报“Hello,World!”,事件if在创建this.name时未定义greet

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

以下也提醒“你好,世界!”:

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 回答