setTimeout(fn,200)
, bedeutet die hier angegebene Zeit, dass sie berechnet wird, sobald das Programm startet? Oder sollten wir warten, bis die Aufgabe des Hauptthreads abgeschlossen ist, und die asynchrone Aufgabenliste zurückrufen, bevor wir mit der Berechnung beginnen?
这个解释起来有点复杂
首先你要明白Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务:不进入主线程、而进入“任务队列”的任务,当主线程上的任务执行完,主线程才会去执行“任务队列”。
对于
setTimeout(fn,200)
,当到200ms时,fn
会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn
,所以当程序执行到setTimeout(fn,200)
这一行时,时间就开始计算,但是fn
实际执行时并不一定是在200ms后,可能是在更久的时间后(取决于主线程上的同步代码的执行时间)。简单的讲
setTimeout(fn,200)
需要等到当前函数调用栈(主进程上的同步任务)清空之后才开始执行,会在下一轮事件循环(主线程从"任务队列"中读取事件)开始时执行,setTimeout
只上将事件插入了"任务队列",这里设置的时间是相对于在下一轮事件循环开始时的时间的间隔。从
setTimeout(fn,200)
调用时开始计时。