为什么Javascript setTimeout函数的行为类似于setInterval?

为什么Javascript setTimeout函数的行为类似于setInterval?,javascript,timer,clock,Javascript,Timer,Clock,作为练习的一部分,我编写了一个简单的函数来显示“二进制时钟”,一个每两秒“滴答”一次的时钟,而不是一秒。我编写的函数实际上是对HTML表单中类似代码的修改(表单中的值会一次又一次地更改) 以下是我仅对JS的修改: function binaryClock() { let currentTime = new Date(); let hr = currentTime.getHours(); let mn = currentTim

作为练习的一部分,我编写了一个简单的函数来显示“二进制时钟”,一个每两秒“滴答”一次的时钟,而不是一秒。我编写的函数实际上是对HTML表单中类似代码的修改(表单中的值会一次又一次地更改)

以下是我仅对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一样


我的意思是,如果我改用
setInterval()
,我会得到完全相同的结果,作为初学者,我仍然没有足够的知识来解释为什么在这种特殊情况下,
setTimeout()
(通常运行一次)会像
setInterval()一样工作
在本例中,我认为在这里提问是非常重要的,因为我在研究中从未遇到过这样的差异。

它的工作原理类似于设置间隔,因为您在每个刻度上都执行设置超时(binaryClick,2000)

因此,基本上,每次时钟“滴答”时,它都会启动下一个滴答“为什么我的Javascript setTimeout函数的行为类似于setInterval?”


因为你已经做到了。您正在递归调用函数
binaryClock()

多亏了deceze的评论,我知道我错过了原始代码中递归的实现。现在,我通过setTimeout()或setInterval内的调用了解了函数每次运行时的调用:

每次勾选时都会调用它,但只会在2秒钟内生效,因为函数本身可能会以任何一种方式递归调用,这是由于语言通常的解释方式


因此,无论采用哪种方式,都可以通过递归实现类似setInterval()的行为。

每次调用
binaryClock
时,都会设置
set
超时,它调用
binaryClock
…哪个
设置
s一个
超时
调用
二进制时钟
…哪个
设置
s一个
超时
调用
二进制时钟
…哪个
设置
s一个
超时
调用
二进制时钟
…哪个
set
s a
Timeout
调用
binaryClock
…我现在理解了递归性,当我看到一个函数包含对自身的调用时,我会调用递归行为。