setTimeOut 模拟 setInterval

为什么不直接用 setInterval 原因:

  1. 累计效应

    每次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
Write a Comment