2011-09-06 36 views
2

我有一个JavaScript中的eventlisteners问题,可能是由于我对语言的不完全控制。Javascript:与“this” - 关键字与事件监听器的问题

我希望使用addEventListener()/ attachEvent()注册事件侦听器;我也希望能够在稍后删除监听器,所以我不能注册匿名函数。

说我现在想注册一个对象的方法作为一个事件监听器。首先我预计addEventListener(event, node, object.method)工作。但是,在阅读完事件后,我现在明白this关键字将在调用事件侦听器时引用事件目标,而不是我的对象。

要解决这个问题,我创建了一个新的方法,对象的methodCallback,就像这样:

object.methodCallback = function() { 
    self.method(); 
} 

self变量被设置在对象的构造函数来复制this。然后,我将object.methodCallback注册为eventlistener。

我觉得这一定是错误的做法。但是,正确的方法是什么?

我道歉,如果这个问题是很常见的,但我一直没能找到有关SO到目前为止

+0

会[帮助](http://stackoverflow.com/questions/337878/js-var-self-this)有帮助给你? –

+0

是的,在其他人看来,其他人最初也觉得这有点尴尬。谢谢! – Mansiemans

回答

2

是很常见的人以这样的方式使用自己的答案。如果你处于以及'如果'不在,我会说使用'自我'。

您需要在范围链中定义自己/那一层。

var self = this; 
object.methodCallback = function() { 
    self.method(); 
} 

是的,这就是它的方式。不幸。

0

重新分配“这个范围”,以便日后可以参考它是Javascript中可接受的行为,因为您稍后可能需要它。 Javascript库(如jQuery和YUI)为您提供了一个易于使用的功能(如jQuery中的$.proxy()YUI.bind())。鉴于他们为您提供这样的功能,我猜测这是一种常见的方法在JS