setTimeOut 模拟 setInterval
为什么不直接用 setInterval 原因:
- 累计效应
每次setTimeout计时到后就会去执行,然后执行一段时间后才会继续setTimeout,中间就多了误差
(误差多少与代码执行时间有关)而setInterval则是每次都精确的隔一段时间推入一个事件
(但是,事件的实际执行时间不一定就准确,还有可能是这个事件还没执行完毕,下一个事件就来了)如果setInterval代码在(setInterval)再次添加到队列之前还没有完成执行,
就会导致定时器代码连续运行好几次,而之间没有间隔。
就算正常间隔执行,多个setInterval的代码执行时间可能会比预期小(因为代码执行需要一定时间)
2.譬如像iOS的webview,或者Safari等浏览器中都有一个特点,在滚动的时候是不执行JS的,
如果使用了setInterval,会发现在滚动结束后会执行多次由于滚动不执行JS积攒回调,
如果回调执行时间过长,就会非常容器造成卡顿问题和一些不可知的错误
3.把浏览器最小化显示等操作时,setInterval并不是不执行程序,
它会把setInterval的回调函数放在队列中,等浏览器窗口再次打开时,一瞬间全部执行时
简单实现
function mySetInterval(){
setTimeout(function(){
mySetInterval()
},1000)
}
PS:JS高程中有提到,JS引擎会对setInterval进行优化,如果当前事件队列中有setInterval的回调,不会重复添加。(不过还是有其他问题)
Comments