本篇主要内容:异步、定时器引发的思考
预计阅读时间:8分钟
了解
我们都知道在js中定时器有两种 setInterval() 、 setTimeout() setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。 setTimeout() :在指定的毫秒数后调用函数或计算表达式。
那么问题来了,定时器真的是定时执行的吗? 刚开始我认为定时器肯定是定时执行的啊,要不然怎么会叫做定时器呢,后来我感觉我好像错了,所以今天就来说说这个问题 定时器真的是定时执行的吗
测试
1 var start = Date.now() 2 console.log('启动定时器前...') 3 setTimeout(function () { 4 console.log('定时器执行了: ', Date.now()-start) 5 }, 100) 6 console.log('启动定时器后...');
我们会发现定时器执行了101ms, 一般会延迟一丁点(可以接受),说白了就是准确的,如果说300ms之后执行呢?
var start = Date.now() console.log('启动定时器前...') setTimeout(function () { console.log('定时器执行了: ', Date.now()-start) }, 100) console.log('启动定时器后...'); for (var i = 0; i < 1000000000; i++) { }
如果像上边这种情况,本来是200ms,但是现在变成了1941ms,那还合适吗?
也就是说我们的定时器真的能保证定时吗?
答案是不能,也可能延迟执行,是在原有设定的时间上又有延迟,加入本来是200ms, 那么现在是1941ms,所以说定时器并不能真正保证定时执行
注意:定时器的回调函数是在主线程执行,无论是非回调函数还是回调函数都是在主线程执行

