settimeout的执行时间是4ms,setinterval是10ms
setTimeOut
和setInterVal
中时间参数并不是到点就立即执行,而是到点将其回调事件加入事件队列中。按照队列先进先出的性质,该回调事件到点之后是否能执行取决于是否属于队列首位,如果前头还有其他事件在等待,则不能按点执行。这并是导致事件等待执行时间出现误差的原因。
在《JavaScript高级程序设计(第三版)》22.3中,有描述:
定时器对队列的工作方式是,当特定时间过去后将代码插入。注意,给队列添加代码并不意味着对它立刻执行,而只能表示它会尽快执行。设定一个 150ms 后执行的定时器不代表到了 150ms 代码就立刻执行,它表示代码会在 150ms 后被加入到队列中。如果在这个时间点上,队列中没有其他东西,那么这段代码就会被执行。
setinterval无视代码错误
setInterval并不定时,某些间隔会被跳过,如果设置的时间间隔小于函数执行的事件的时间,那么某个函数的执行可能会被忽略(每个setTimeout产生的任务会直接push到任务队列中;而setInterval在每次把任务push到任务队列前,都要进行一下判断(看上次的任务是否仍在队列中))
可能多个定时器会连续执行
setTimeout模拟setInterval
setTimeout(function () { // 任务 setTimeout(arguments.callee, interval); }, interval)
在前一个定时器执行完前,不会向队列插入新的定时器
(解决缺点一)- 保证定时器间隔(解决缺点二,好于setinterval)