转:setTimeout/setInterval的执行时间的逻辑处理

举个例子:
一断很复杂的代码,中间我设置了一个定时器,在200ms之后自动执行:
setTimeout(function(){console.log(‘timeout!’);},200)
问题来了,为什么有时候调试,它的执行时间超过200ms?
有时候甚至是500ms之后才执行匿名函数里面的代码?
原因:

首先要明白Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务:不进入主线程、而进入“任务队列”的任务,当主线程上的任务执行完,主线程才会去执行“任务队列”。

对于setTimeout(fn,200),当到200ms时,fn会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn,所以当程序执行到setTimeout(fn,200)这一行时,时间就开始计算,但是fn实际执行时并不一定是在200ms后,可能是在更久的时间后(取决于主线程上的同步代码的执行时间)。

所以:只有计时器到200ms才会将fn放进“任务队列”,然后等当前主线程代码执行完才会执行fn,所以说执行时间只会比设定时间大,不会比它小。

转自:https://segmentfault.com/q/1010000009595073?_ea=1990497

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值