2009-12-08 44 views
0

對象調用函數我有一個這樣定義的對象:在使用JavaScript

Blah = { 

    hideTimer:null, 

    setTimer: function() { 
    this.hideTimer = window.setTimeout(Blah.hidePopupInner, 500); 
    // must be done via window due to Greasemonkey 
    }, 

    hidePopupInner: function() { 
    log("This? " + this); 
    }, 

    hidePopupInnerPublic: function() { 
    Blah.hidePopupInner(); 
    } 
} 

的問題是,「這」在KillTimer函數是設置爲胡說。如果我改行

this.hideTimer = window.setTimeout(Blah.hidePopupInnerPublic, 500); 

那麼'this'指向Blah,因此可以使用hideTimer。

爲每種方法制定一個「公共」方法解決了這個問題,但必須有一個更簡單的解決方案......?

注意:這一切都在Greasemonkey,但我認爲這是一個通用的Javascript問題。

回答

6

要解決這個問題,您可以在構建超時時使用匿名函數和範圍引用。 PS:另外,setTimeout會將毫秒數傳遞給被調用函數。例如:想象你的功能可以接收一個參數,並用它做一些事情。但是因爲setTimeout會將毫秒傳遞給你的函數,所以會導致意想不到的錯誤。

+0

你能說清楚你的PS嗎?你的意思是在我的代碼中它會這樣做嗎? – 2009-12-08 15:24:39

+0

我的PS,只是我自己用setTimeout的經驗,它不會在你的情況下產生任何問題。 – nemisj 2009-12-08 15:43:23

+0

完美,謝謝你 – 2009-12-08 16:41:57

2

基本上指定爲setTimeout參數的函數就像回調一樣執行。
你沒有得到Blah上下文的原因是你切換到setTimeout範圍(即使使用Blah方法)。

我根本不知道Greasemonkey,但使用函數方法如綁定會幫助你。 如果在GM中沒有像bind這樣的函數,你可以寫它,但你自己(幾行代碼) - 可以複製PrototypeJS之一。
http://www.prototypejs.org/api/function/bind

它基本上 執行 與specifed範圍準備你的函數:

// inside Blah 
setTimeout (Blah.hidePopupInner.bind(this), 500); 

其實Tableton的解決方案是綁定的飛

+0

酷,我會檢查出來的,或者我甚至可以用我的腳本打包Prototype。謝謝! – 2009-12-08 15:31:42

1

實施雖然不是一個真正的解決範圍的問題,你至少可以在Blah.killTimerPublic附近做:

window.setTimeout(function(){ Blah.hidePopupInner() }, 500); 
+0

謝謝賈斯汀。雖然這是有效的,但它只適用於一個實例......無論如何,這就是它的定義,所以+1 – 2009-12-09 10:33:28