时间: 4.12
原文地址:https://juejin.cn/post/6844903512845860872
先前也理解了宏任务微任务队列,再看看高赞文章差缺补漏一下。
- 在HTML5中提出了Web-Worker,模拟了“多线程”。
- 事件循环是同步任务先进主线程和执行完成后回调异步任务的循环过程。
-
setTimeout函数的执行过程
- 内部回调进入Event Table且计时
- 执行下一行同步任务,继续主线程
- 计时完成,内部回调进入 Event Queue等待主线程为空后执行
总结:setTimeout因为事件循环机制,等待主线程的时间未知,是有可能回调执行时间要大于计时时间。
- setInterval的基础执行过程同setTimeout,再加循环而已
坑点:如果内部回调执行时间大于计时时间,那么在内部回调完成后,下一次回调早已经进入Event Queue主线程也空出来的了,会直接执行,而不会有预期的等待时间。
- Promise&process.nextTick微任务
需要注意的是:上述提到事件循环是同步任务先进主线程和执行完成后回调异步任务的循环过程。
宏任务不在同步任务之中,所以宏任务微任务的循环,并不适用上述条件。 -
而是宏任务执行一次完成,再执行完当前所有微任务
所以根据下图图示,是执行完setTimeout1,挂起setTimeout2,先去执行完现有的所有微任务,完成一次循环,再回来执行setTimeout2.
还有个很有意思的点,js的执行和运行要分开看待,js的解析是运行,是由语言定的一致的,具体的执行就会分环境有略微不同的表现。
这可以确定,js就是单线程,逐行运行的,这个一定不变&宏任务微任务循环是执行机制确定的,这个可能会有些许差异。
关键词:模拟多线程、宏任务微任务循环、setTimeout会因主线程卡住而阻塞、setInterval也有setTimeout的问题且
会因内部函数卡住而不进行下一个循环、