我试图在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/
我的问题是:
this
变为'merged'窗口和jQuery.Event对象?答案 0 :(得分:1)
bind
的第一个参数是用于this
的新上下文。通过传递undefined
,你基本上没有传递第一个参数。
第二个和更多参数作为第一个值传递给函数。
另请注意,this
在全局范围内时,引用window
对象。
所以,b
......
console.debug.bind(undefined,this);
与......相同。
function(){ console.debug(window); }
..因为您将this
(window
)作为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()可以接受并显示多个对象,这正是您在开发人员控制台中看到的。