2011-09-06 66 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