2017-08-28 49 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()

相关问题