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

Why does my Javascript setTimeout function behaves like a setInterval?

作为练习的一部分,我编写了一个简单的函数来显示 "binary clock",一个每两秒 "ticks" 的时钟,而不是一个。我写的函数实际上是对类似代码的修改,它以 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 就像 binaryClock 回调上的 setInterval 一样?

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

它的工作原理类似于 setInterval,因为您在每个滴答上都执行 setTimeout(binaryClick,2000)。

所以基本上,每次你的时钟 "ticks" 它开始下一个滴答

"Why does my Javascript setTimeout function behaves like a setInterval?"

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

感谢发表评论的 deceze,我知道我错过了原始代码中递归性的实现。我现在明白函数每次运行时都会通过调用 setTimeout() 或 setInterval:

调用自身

它在每个 tick 中被调用,而只有 2 秒生效,因为由于语言通常被解释的方式,该函数本身可以递归地递归。

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