2017-08-28 50 views
-4

作爲一個練習的一部分,我寫了一個簡單的函數來顯示一個「二進制時鐘」,這是一個每兩秒「滴答」一次而不是一次的時鐘。我寫的函數實際上是對HTML表單中的類似代碼的修改(表單中的值會一次又一次地改變)。爲什麼我的Javascript setTimeout函數的行爲像一個setInterval?

這裏是我的JS-唯一的修改:

function binaryClock() {       
    let currentTime = new Date(); 
    let hr = currentTime.getHours(); 
    let mn = currentTime.getMinutes(); 
    let sc = currentTime.getSeconds(); 

    setTimeout('binaryClock()', 2000); 
    document.body.innerHTML = ''; 
    document.write(hr + ':' + mn + ':' + sc + ' '); 
} 

binaryClock(); 

爲什麼它的實際工作音程,因爲任何時鐘在這個意義上是將行爲setTimeout喜歡的setInterval在binaryClock回調?我的意思是,如果我使用setInterval()代替,我得到完全相同的結果,並且作爲初學者,我仍然沒有足夠的知識來解釋爲什麼在這種特殊情況下,setTimeout()(通常運行一次)可以工作如setInterval()在這種情況下,看到它足夠重要的問這裏,因爲我從來沒有在我的研究中發現這種差異。

+5

每當你調用'binaryClock'時'Timeout'正被'set'調用'binaryClock'; ...設置'Timeout',它調用'binaryClock'; ...設置'Timeout',它調用'binaryClock'; ...設置'Timeout',它調用'binaryClock'; ...其中'設置'超時'調用'binaryClock' ... – deceze

+0

我明白了現在的recurisivness,並會在我看到一個包含對自己的調用的函數時調用此行爲遞歸。 – sangoko

回答

-1

感謝deceze who評論,我明白我錯過了原始代碼中recursivness的實現。我現在通過setTimeout()或setInterval中的調用瞭解函數每次運行時的函數調用方式:

它在每個tick中被調用,而只有2秒纔會生效,因爲函數本身可以遞歸由於語言通常被解釋的方式。

因此,一個setInterval()類似的行爲將通過任何方式從recursivness中實現。

1

它的工作方式與setInterval相似,因爲您在每個打勾上執行setTimeout(binaryClick,2000)。

所以基本上,每個時鐘「滴答」一次啓動下一個節拍

3

「爲什麼我的JavaScript setTimeout函數的行爲就像一個setInterval的?」

因爲你已經這樣做了。你正遞歸地調用你的函數binaryClock()

相關問題