当添加为事件处理程序时,JQuery似乎会覆盖我的实例方法的this
关键字。为什么会这样?代码如下:
function Foo() {};
Foo.prototype.bark = function() {
console.log(this);
};
var foo = new Foo();
$("#b").click(foo.bark);
点击输出:
<button id="b" type="button">
但是JQuery似乎没有覆盖下面代码中的this
关键字:
$("#b").click(function() { foo.bark(); });
点击输出:
`Foo { bark=function()}`
答案 0 :(得分:5)
这是预期的行为。分配为事件侦听器的所有函数都将this
指向触发事件的元素实例。
您可以通过使用匿名包装函数来解决此问题:处理程序如下:
$("#b").click(function() {foo.bark() });
答案 1 :(得分:2)
这是因为click
将对元素的引用传递给它的处理程序(在你的情况下是 )
执行此操作时:
$("#b").click(function(){
foo.bark();
});
您将无法使用this
引用bark()
中的点击元素
答案 2 :(得分:1)
handler参数采用回调函数...在处理程序中,关键字
this
引用处理程序绑定的DOM元素。
答案 3 :(得分:-1)
您的问题的解决方案是$.proxy()
。您可以阅读更多相关信息here
尝试$('#b').on('click', $.proxy( foo.bark, this ) )
编辑:实际上正确的代理功能调用是 $.proxy( foo.bark, foo );