为什么我的Javascript setTimeout函数的行为像一个setInterval?
作为一个练习的一部分,我写了一个简单的函数来显示一个“二进制时钟”,这是一个每两秒“滴答”一次而不是一次的时钟。我写的函数实际上是对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()
在这种情况下,看到它足够重要的问这里,因为我从来没有在我的研究中发现这种差异。
感谢deceze who评论,我明白我错过了原始代码中recursivness的实现。我现在通过setTimeout()或setInterval中的调用了解函数每次运行时的函数调用方式:
它在每个tick中被调用,而只有2秒才会生效,因为函数本身可以递归由于语言通常被解释的方式。
因此,一个setInterval()类似的行为将通过任何方式从recursivness中实现。
它的工作方式与setInterval相似,因为您在每个打勾上执行setTimeout(binaryClick,2000)。
所以基本上,每个时钟“滴答”一次启动下一个节拍
“为什么我的JavaScript setTimeout函数的行为就像一个setInterval的?”
因为你已经这样做了。你正递归地调用你的函数binaryClock()
。
每当你调用'binaryClock'时'Timeout'正被'set'调用'binaryClock'; ...设置'Timeout',它调用'binaryClock'; ...设置'Timeout',它调用'binaryClock'; ...设置'Timeout',它调用'binaryClock'; ...其中'设置'超时'调用'binaryClock' ... – deceze
我明白了现在的recurisivness,并会在我看到一个包含对自己的调用的函数时调用此行为递归。 – sangoko