JavaScript运行机制

了解event loop前首先要了解JavaScript运行机制,它是单线程。则一次只能执行一个事件,后面的事件要排队。
举一个不十分恰当的例子,可以把它比作理发师和客户。
一名理发师一次只能给一名客户剪头发or烫染,其他客户只能等待。
那如果一名客户烫染时间很久的时候,难道要别的客户一直干等着吗,当然不是啦!
这时理发师会请烫染的客户在一旁等候,然后给下一位客户理发。
因为不同客户服务类型不同,所以有了同步异步之分,理发可以比喻为同步任务,烫染可以理解为异步任务
JavaScript为什么必须是单线程的原因在于它是可以操作Dom节点的,为了防止出现有一线程修改Dom节点文本,另一线程删除该节点这种情况发生。

同步异步任务

同步的意思非常容易理解,就是客户洗发、理发、吹头、结账,所有事情是一连串完成。
异步的意思则是一件事情分不同的步骤完成。当客户需要烫染时,首先上药水,等待1-2个小时,药水浸泡成效后,通知理发师,如果理发师空闲则继续对客户操作,否则当理发师剪完当前排队的客户后再操作,最后结账。

宏任务与微任务

翻阅了很多资料和资料,目前并没有找到官方文档解释宏任务与微任务的定义。
个人认为宏任务可以理解为我们平常的代码,而微任务这个异步任务的回调,例如说Promise的then、catch、finally方法。
宏任务(也是异步任务):setTimeout()、setInterval()、I/O
微任务:Promise的回调 .then .catch .finally
它们之间最大的区别在于微任务是得到结果后需要立刻执行的,而宏任务是大于等于等待时间执行的

宏任务与微任务的执行顺序
事件循环

绕了这么久,终于写到了事件循环。
JS引擎开始运行,解析并执行代码,首先判断是同步还是异步,如果是同步任务,加入执行栈,异步任务放到任务队列。
当执行栈的事件执行完毕,将任务队列的事件释放,首先检查是否任务队列里是否存在微任务
如果有,全部执行完毕后再执行下一个宏任务


someone
218 声望7 粉丝

前端工程师