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

时间:2017-08-28 13:18:36

标签: javascript timer clock

作为练习的一部分,我写了一个简单的函数来显示一个"二进制时钟",一个时钟"滴答"每两秒,而不是一秒。我编写的函数实际上是对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()代替,我会得到完全相同的结果,作为初学者,我仍然没有足够的知识来解释为什么在这种特殊情况下,{{1}在这种情况下,(通常会运行一次)会像setTimeout()一样工作,看到它在这里问得足够重要,因为我从未在学习中遇到过这样的差异。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

它的作用类似于setInterval,因为你在每个tick上都有一个setTimeout(binaryClick,2000)。

所以基本上,每次你的时钟“滴答”它就会开始下一个滴答

答案 2 :(得分:-1)

感谢deceze评论,我理解我错过了原始代码中recursivness的实现。我现在明白函数每次运行时都会通过setTimeout()或setInterval中的调用来调用它自己:

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

因此,无论如何都会从recursivness中实现类似setInterval()的行为。