将函数引用传递为jQuery中的事件处理程序

时间:2016-11-29 00:05:51

标签: javascript jquery

我试图在jQuery中将函数引用作为事件处理程序传递。我想使用下面简单示例中的简写...

$("a").click(console.debug.bind(undefined,this));

...而不是明确传递整个函数体:

 $("a").click(function() {
     console.debug(this)
 });

此外,我想在我的速记函数中访问由jQuery选择的元素(并将它们作为参数传递)。换句话说:我希望$("a")的结果为this(或任何其他将检索结果的代码)。

到目前为止,我已经尝试过:

var a = function() {
    console.debug(this);
};

var b = console.debug.bind(undefined,this); 

$("a").click(function() {console.debug(this)}); // prints link
$("a").click(a); // prints link 
b(); // prints Window
$("a").click(console.debug.bind(undefined,this)); // prints Window & jQuery.Event

这是小提琴: https://jsfiddle.net/hbqw2z93/1/

我的问题是:

  1. 是否可以使用这样的结构并满足所有要求,而无需定义其他变量 - 只需一行如上所示?
  2. 是否可以使用所描述的方法访问jQuery的选择结果?
  3. 为什么在给定范围this变为'merged'窗口和jQuery.Event对象?

2 个答案:

答案 0 :(得分:1)

bind的第一个参数是用于this的新上下文。通过传递undefined,你基本上没有传递第一个参数。

第二个和更多参数作为第一个值传递给函数。

另请注意,this在全局范围内时,引用window对象。

所以,b ......

console.debug.bind(undefined,this);

与......相同。

function(){ console.debug(window); }

..因为您将thiswindow)作为debug的第一个参数传递。

默认情况下,当您向元素附加事件时,this将自动指向捕获事件的元素,因此甚至不需要绑定,这就是为什么$("a").click(a);无法工作的原因使用bind。

答案 1 :(得分:1)

  • 你已经在使用它了,不是吗? :)这是有限的,但它适用于你自己的小提琴

  • jQuery会将事件对象传递给您指定的函数。您可以使用函数绑定将其作为参数传递(您已经在小提琴中使用它)

  • 没有。看看发生了什么:

jQuery passed one argument单击处理函数 - 事件对象。您将console.debug.bind(undefined, this)作为处理函数传递,因此jQuery将使用一个参数调用它。

然后,当您将you are asking to use 'undefined'绑定为函数内的'this'对象并发送一个额外的参数 - 'this'时,这是一个Window,因为您在最高级别绑定。 / p>

因此,当实际点击发生时,jQuery使用两个参数调用console.debug - 在click()期间绑定的Window对象和始终传递给click处理程序的jQuery事件。 console.debug()可以接受并显示多个对象,这正是您在开发人员控制台中看到的。