2011-06-09 27 views
1

我有這樣的Javascript類:的Javascript超時問題

function PageManager() { 
    this.timeoutHandler = function() { 
     alert ("hello"); 
    } 

    this.startTimeout = function() { 
     this.timeout = setTimeout ("this.timeoutHandler()", 1000); 
    } 
} 

當我打電話obj.startTimeout();我得到這個錯誤:

this.timeoutHandler is not a function 

如何調用類函數在超時?

+0

你如何定義'obj'? – Dancrumb 2011-06-09 13:44:48

+0

重複? http://stackoverflow.com/questions/1101668/javascript-howto-use-settimeout-to-invoked-obecjt-itself – SergeS 2011-06-09 13:47:07

+0

是的,對不起。 – Nik 2011-06-09 13:48:16

回答

7

如果您將字符串傳遞給setTimeout,則代碼將在全球範圍中進行評估。始終傳遞一個函數引用

this.startTimeout = function() { 
    var self = this; 
    this.timeout = setTimeout(function() { 
     self.timeoutHandler(); 
    }, 1000); 
} 

或者,如果你不需要內部timeoutHandler對象的引用,那麼你可以直接傳遞函數:

this.timeout = setTimeout(this.timeoutHandler, 1000); 
3

的問題是,你'重新傳遞setTimeout一個字符串。該字符串是eval'd,具有該窗口的範圍。所以,如果你是這樣做:

this.timeout = setTimeout ("console.log(this);", 1000); 

...安裝Firebug的,你會看到thiswindow,其中沒有一個timeoutHandler方法,當然。

這就是爲什麼你永遠不應該通過setTimeout一個字符串。改爲給它一個函數參考。

function PageManager() { 
    this.timeoutHandler = function() { 
     alert ("hello"); 
     console.log(this); 
    } 

    this.startTimeout = function() { 
     this.timeout = setTimeout (this.timeoutHandler, 1000); 
    } 
} 
obj = new PageManager(); 
obj.startTimeout(); 

當你執行這段代碼時,你會得到你想要的範圍。