2012-06-28 51 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();