2017-05-30 222 views
0

我最近正在做一個計時器對象和一個滴答作用的功能,根據setTimeout循環每秒鐘會打勾。但是,滴答作響沒有延遲。如果你嘗試下面的代碼,你會發現時間編號在幾秒鐘內就增加到了數千。如果有的話,我做錯了什麼?setTimeout不會延遲

<html> 

<head> 

</head> 
    <button onclick="startTimer()">Start</button> 
    <button onclick="stopTimer()">Stop Timer</button> 
    <button onclick="readTimer()">Read Timer</button> 

    <script> 
function tick(){ 
    console.log("TICK TOCK"); 
    if(this.running == true){ 
     this.time += 1; 
     console.log("HELLO!"); 
     setTimeout(this.tick(), 1000, $(this)); 
    } 

} 

function start(){ 
    this.running = true; 
    this.tick(); 
} 
function read(){ 
    return this.time; 
} 
function stop(){ 
    this.running = false; 
} 

function reset(){ 
    if(this.running == false){ 
     this.time = 0; 
    }else { 
     this.time = 0; 
    } 
    this.tick(); 
} 
function timer(){ 
    this.running = false; 
    this.time = 0; 
    this.start = start; 
    this.read = read; 
    this.stop = stop; 
    this.reset = reset; 
    this.tick = tick; 
} 
var t = new timer(); 

     function startTimer(){ 
      t.start(); 
     } 
     function stopTimer(){ 
      t.stop(); 
     } 
     function readTimer(){ 
      alert("This is the current Timer Reading: " + t.time); 
     } 





    </script> 
</html> 
+1

你逝去的執行功能,而不是一個功能'setTimeout'。做'setTimeout(this.tick.bind(this),1000)'。 – trincot

+0

它的工作原理!非常感謝。沒有你的幫助,我不會解決這個問題。 –

回答

1

您的錯誤是您致電setTimeOutthis.tick()。當您在tick()函數中調用this時,您已經指tick函數,,因此您想使用setTimeout(this, 1000);並且您的計時器將正常工作。

看到這個搗鼓解決方案:https://jsfiddle.net/sg7yf6r4/

瞭解更多關於該問題:Javascript objects calling function from itself

+0

出於某種原因,從setTimeout(this.tick(),1000)更改代碼; setTimeout(this,1000)會產生一個錯誤:Uncaught SyntaxError:意外的標識符。 –

+0

仔細檢查你的代碼;這裏是一個CodePen,按照預期工作:https://codepen.io/anon/pen/LyKwXG確保你沒有拼寫錯誤。 –

+0

我檢查了我的拼寫,並且找不到任何理由使其不起作用,但它仍然只在運行之前運行滴答功能一次,然後留下錯誤消息。 function tick(){ console.log(「TICK TOCK」); (this.running == true){this.time + = 1; if(this.running == true){this.time + = 1; this.time + = 1; console.log(「HELLO!」); setTimeout(this,1000); } } –

0

setTimeout,第一個參數是一個函數。但是,你傳遞了一個函數的結果。因此,您應該使用setTimeout(this.tick, 1000, $(this));而不是setTimeout(this.tick(), 1000, $(this));

+0

解決你的問題:「未捕獲的ReferenceError:未定義$」 –

0

您正在通過執行函數,而不是函數參考setTimeout。要傳遞函數本身,請刪除括號。其次,爲確保this仍然是當前this,最終調用tick時,請使用.bind(this)

請注意,setTimeout的第三個參數會將該值傳遞給tick,這在您的情況下是沒有用的。注意:$(this)可能是其他代碼的補充,因爲$通常會用於您未使用的jQuery。

因此,採取所有在一起,這樣做:

setTimeout(this.tick.bind(this), 1000)