2015-10-25 68 views
0

你好,我是完全新的JavaScript和我試圖做一些事情,但是當我把這個功能我不明白:setInterval的調用方法(這)調用它只有一次

this.start = function() { 
    this.interval = setInterval(startIncrement.call(this) , 1000); 
} 

startIncrement只執行一次。我嘗試這樣做,產生兩個按鈕Counter類(啓動和停止)和一個textbox.So當我這樣做:

var a = new Counter(); // generates object of Counter 
a.init(); // generates the HTML (did that part) 
a.start(); //start increasing the value of text box over period of time 
a.stop(); // stops the counting (did that part) 

和按鈕啓動和停止只需調用啓動和停止計數的方法onclick事件。我試過這個問題的所有答案setInterval only runs once on object method但它沒有工作,現在我卡住了。

+1

該問題的第一個答案是對你的問題的回答:setInterval需要一個函數傳遞給它,並且你傳遞調用你的「startIncrement」函數的結果。也許你的意思是'.bind()'而不是'.call()'。 – Pointy

+0

是的,現在你說它是完全合理的,但可悲的是我不知道何時使用呼叫,綁定或應用我已經閱讀過有關它們,但我似乎濫用它們..你能解釋一下嗎?如果你有時間,我如何工作?提前致謝。 P.S我已經問過這樣做了,但是如果你想要的話,你也可以這樣做:) – kuskmen

+0

@spender解釋了'.bind()'這是三個中的唯一一個讓你回到以後使用的函數。 '.call()'和'.apply()'都是立即調用函數的方法;他們在細節上有所不同,但他們基本上是一樣的。 – Pointy

回答

3

使用函數的.call方法立即調用它,其中函數的內容的(第一個)參數變爲this

通過使用

setInterval(startIncrement.call(this) , 1000); 

你立即調用startIncrement方法和使用任何返回作爲參數傳遞給setInterval。除非它返回一個函數,這不是你想要的。

你的意思是:

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

.bind將手你回來說,當你調用它,是有保證的有(第一個)參數爲this對象的函數。它不調用該函數。它創建了一個新函數,它包裝了原始函數,在調用它包裝的原始函數時做了少量工作來更改對象。

+0

是的!我一定誤解了這些功能..事實上你能否解釋我更多關於應用,打電話和綁定的事情,因爲我一直在爲他們閱讀一個小時,而且我似乎在不恰當地使用它們......如果你有時間的話。 – kuskmen