2010-07-13 94 views
2

所以,我試圖創建一個JavaScript對象,並使用setInterval方法。javascript setInterval不適用於對象

這似乎沒有工作。如果我刪除引號,那麼該方法運行一次。任何想法爲什麼?另外,我正在使用Jquery。

<script> 
$(function(){ 
    var kP = new Kompost(); 
    setInterval('kP.play()', kP.interval); 
}); 

var Kompost = function() 
{ 
    this.interval = 5000; 
    var kompost = this; 

    this.play = function() 
    { 
     alert("hello"); 
    } 
} 
</script> 
+0

聖克羅克福德,他用eval! :O – Vincent 2010-07-13 23:57:20

回答

7

這樣稱呼它:

$(function(){ 
    var kP = new Kompost(); 
    setInterval(kP.play, kP.interval); 
}); 

的問題是,kPdocument.ready處理器內部,可在全球範圍內(這是唯一可用的閉包)。當你傳遞一個字符串到setInterval()setTimeout()它在全局上下文中執行。

如果你檢查你的控制檯,你會看到它的錯誤,說kP是未定義的,在這種情況下,是正確的。整體而言,這應該是這樣的:

var Kompost = function() 
{ 
    this.interval = 5000; 
    var kompost = this; 
    this.play = function() { 
    alert("hello"); 
    }; 
}; 

$(function(){ 
    var kP = new Kompost(); 
    setInterval(kP.play, kP.interval); 
}); 

You can see it working here

+0

+1比我的(現在刪除)答案更好的解釋。 – Yacoby 2010-07-13 23:26:59

8

通過@Yacoby和@Nick提供的解決方案,將只工作,如果play方法不使用內部本身this值,因爲this值將指向全局對象。

爲了解決這個問題,你需要另一種方法,例如:

$(function(){ 
var kP = new Kompost(); 
setInterval(function() { 
    kP.play(); 
}, kP.interval); 
}); 

參見:

+0

我明白了,謝謝。我只給了尼克解決方案,因爲這對我來說效果很好。但我理解你的觀點,我絕對認爲它是一種通用的方法。另外我沒有意識到設置的時間間隔可以採取這樣的功能。 +1 – 2010-07-13 23:46:13

0

它適用於每一個地方像thymeleaf等...

function load() { 
    alert("Hello World!"); 
} 
setInterval(function() {load();}, 10000);