Javascript 绑定函数,其中包含;这";(JQuery)

Javascript 绑定函数,其中包含;这";(JQuery),javascript,jquery,Javascript,Jquery,考虑以下对象: var obj = { name: "pete", funct : function () { console.log("I am", this); } } 当将obj.funct绑定到事件处理程序时,它会释放对对象的引用,现在它引用全局对象(窗口) 因此,这无法正常工作: $(window).bind("keypress", obj.funct); 当事件处理程序调用此对象时,如何存档它仍然指向我的对象?使用并传递此: var obj = { name: "pe

考虑以下对象:

var obj = {
  name: "pete",
  funct : function () { console.log("I am", this); }
}
当将obj.funct绑定到事件处理程序时,它会释放对对象的引用,现在它引用全局对象(窗口)

因此,这无法正常工作:

$(window).bind("keypress", obj.funct);
当事件处理程序调用此对象时,如何存档它仍然指向我的对象?

使用并传递此:

var obj = {
  name: "pete",
  funct : function () { console.log("I am", this); }.bind(this)
}

创建一个引用此变量的作用域变量

var that = this;
var obj = {
  name: "pete",
  funct : function () { console.log("I am", that); }
}
或者你可以采取另一种方法

var HoldAllValues=function(){
var origin=此;
this.name=“pete”,
this.funct=function(){console.log(“我是”,origin.name);origin.name='健忘症';}
}
var gatekeeper=new HoldAllValues();
$(window.bind(“按键”,gatekeeper.funct)

bind
是一个选项。但是
代码中的
指的是
窗口
对象<代码>$(window.bind(“按键”,obj.funct.bind(obj))
@Vohuman使用jquery
$.proxy()
而不是
Function.prototype.bind()
,因此您可以在以后删除引用的处理程序,这是使用
.bind()
无法实现的<代码>$(窗口).bind(“按键”,$.proxy(obj.funct,obj))和以后需要时:
$(窗口).unbind(“按键”,$.proxy(obj.funct,obj))@A.Wolff上下文确定
$.proxy
是另一个选项。@Vohuman当使用refrenced方法作为处理程序处理事件时,我们不应该使用
Function.prototype.bind()
。请参见例如:此处更相关:@A.Wolff,因为您无法解除处理程序的绑定?虽然这会起作用,但我一直认为这是一种反模式。如果只是从词汇上来说,“this”和“that”是一样的,这不是直觉,而是利用了javascript特性。在本质上,当通过不同的对象传递对象时,您指的是原始对象。这只是习惯的问题。通过这种方式,您可以访问当前对象的This变量,并将更改推回到原始对象,而不必使用注册表来保持一致性。是的,我知道它是如何工作的-我只是说它是不直观的,如果用英语来说,“that”指的是与“This”相同的东西.但事实并非如此。在您发布的示例中,此===jQuery,不等于原始对象。当您通过单击处理程序、加载处理程序、ajax加载处理程序“传递”对象的那一刻,您的代码就会发生变化。您的此引用引用当前工作对象才是正确的。这个,或者你想叫它什么(起源,父亲,母亲,创造者)都引用了起源对象。我更喜欢这样称呼它,因为许多开发人员使用它来实现这个目的,但是如果你想成为一个首创者,你可以给它一个更“逻辑”的名字。我在我的答案中添加了一个新的例子,在一个范围内使用/origin。