2010-07-13 60 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);