2012-06-28 26 views
4

如何使用“setInterval”的“call”来获取对象字面值来调用其自己的方法之一?使用setInterval调用Javascript绑定

下面是一个例子。 这工作,我明白它为什么工作。 定时器对象调用它自己的蜱方法一旦每个第二

var timer = 
{ 
    start: function() 
    { 
    var self = this; 
    setInterval(function(){self.tick();}, 1000); 

    }, 

    tick: function() 
    { 
    console.log("tick!"); 
    } 
}; 

timer.start(); 

我试图通过使用“呼叫”来简化此代码。 下一个例子是我想到的最好的例子。 但它不起作用:tick方法只被调用一次,然后出现类型错误。

var timer = 
{ 
    start: function() 
    { 
    setTimeout.call(this, this.tick(), 1000); 
    }, 

    tick: function() 
    { 
    console.log("tick!"); 
    } 
}; 

timer.start(); 

我想我真的不明白电话是如何工作的。 任何人都可以解释我做错了什么?

谢谢!

+0

请参阅本http://stackoverflow.com/questions/6112330/javascript-settimeout-call-error –

回答

11

您是.calling.setInterval不是你的回调函数,浏览器调用:

setInterval(this.tick.bind(this), 1000); 

应该工作。见.bind

+0

的Safari 5.1.5这给了我“TypeError:undefined不是函数”。 Firefox 8.0.1给了我“未捕获的异常:对WrappedNative原型对象的非法操作”。 – d13

+0

@ user1282216查看链接。我假设开发人员不使用过时的软件进行开发,但显然我错了:P。 Firefox的错误很有趣,你能给我一个jsfiddle吗? – Esailija

+0

@ user1282216 nevermind我可以在Firefox 13中重现该错误,你做错了。使用代码'setInterval(this.tick.bind(this),1000)'而不是'setInterval.call(this)'(导致错误) – Esailija

0

这是我结束了:

var timer = { 
    time: 0, 
    start: function() { 
     var timerTick = this.tick.bind(this); 
     window.setInterval(function() { 
     timerTick(); 
     }, 1000); 
    }, 
    tick: function() { 
     this.time += 1; 
     console.log(this.time); 
    } 
    }; 

    timer.start();