作为练习的一部分,我写了一个简单的函数来显示一个"二进制时钟",一个时钟"滴答"每两秒,而不是一秒。我编写的函数实际上是对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()
一样工作,看到它在这里问得足够重要,因为我从未在学习中遇到过这样的差异。
答案 0 :(得分:3)
"为什么我的Javascript setTimeout函数的行为类似于setInterval?"
因为你已经这样做了。您正在递归调用函数binaryClock()
。
答案 1 :(得分:1)
它的作用类似于setInterval,因为你在每个tick上都有一个setTimeout(binaryClick,2000)。
所以基本上,每次你的时钟“滴答”它就会开始下一个滴答
答案 2 :(得分:-1)
感谢deceze评论,我理解我错过了原始代码中recursivness的实现。我现在明白函数每次运行时都会通过setTimeout()或setInterval中的调用来调用它自己:
在每个tick中调用它,而只有2秒生效,因为该函数本身可以递归地递归,因为语言通常被解释。
因此,无论如何都会从recursivness中实现类似setInterval()的行为。