JavaScript单线程与任务队列

众所周知,JavaScript是一门单线程语言,单线程意味着在同个时间点只能做一件事情,前一个任务执行完了,才执行后面的任务。这些任务都有一个先后顺序,就像我们日常生活中排队一样。JavaScript内部的任务队列正是如我们所描述的,其中排列着等待执行异步任务。

同步任务/异步任务

在JavaScript内部,任务可以分为两种:同步任务和异步任务。其中同步任务在主线程上执行,前一个执行完后一个才执行;异步任务在任务队列中等待,只有当主线程任务执行完毕后,才轮到它们运行。

event loop

同步任务进入主线程,异步任务进入event table,等到事件执行完毕,回调函数进入event queue;当主线程任务执行完毕,主线程再从event queue中读取事件绑定的函数,将其调入主线程中执行,这个过程是循环重复的,因此也被称为event loop事件循环。

setTimeout/setInterval

setTimeout原理,并不是说在delay之后就执行回调,而是在这个delay之后,将回调放入消息队列中,等到JS主线程执行完毕后再执行消息队列的程序。这就意味着如果主线程上的代码执行时间很长,定时器的任务会一直等待,因此是没办法保证指定任务一定在delay后执行。即使是setTimeout(fn, 0),也是将任务放入消息队列后等待执行,0意味着指定某任务在主线程最早得到空闲时执行。setInterval同理,其执行时机依赖于主线程的执行速度。