JS的任务执行机制
由于 JavaScript 是单线程的,所以它只有一个Call Stack
,使得 JavaScript 在执行时有一个非常重要的特性:run to complete
,只要运行就直到完成。
由于是单线程,所以只能通过异步解决性能问题(否则,如果前面一个任务阻塞了,那么后续的任务都要等待,这种效果是无法接受的)。
js在执行代码时存在着两个比较重要的东西:执行栈和任务队列,这两个东西都是用来存储任务的,区别在于:执行栈里面存着的都是同步任务,也就是要按顺序执行的任务;而任务队列中存着的是一些异步任务,这些异步任务一定要等到执行栈清空后才会执行(这句话很重要)。
关于任务队列,它还分成两种,一种叫作macrotask queue
(姑且这么命名,因为严格来说规范中只有说task,并没有提到macrotask
这个概念。这里为了容易区分,可以理解为macrotask=task!=microtask
),另一种叫作microtask queue
。
如