举个例子:
一断很复杂的代码,中间我设置了一个定时器,在200ms之后自动执行:
setTimeout(function(){console.log(‘timeout!’);},200)
问题来了,为什么有时候调试,它的执行时间超过200ms?
有时候甚至是500ms之后才执行匿名函数里面的代码?
原因:
首先要明白Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务:不进入主线程、而进入“任务队列”的任务,当主线程上的任务执行完,主线程才会去执行“任务队列”。
对于setTimeout(fn,200),当到200ms时,fn会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn,所以当程序执行到setTimeout(fn,200)这一行时,时间就开始计算,但是fn实际执行时并不一定是在200ms后,可能是在更久的时间后(取决于主线程上的同步代码的执行时间)。
所以:只有计时器到200ms才会将fn放进“任务队列”,然后等当前主线程代码执行完才会执行fn,所以说执行时间只会比设定时间大,不会比它小。