JavaScrtipt 执行顺序
首先,必须要明确,在JavaScript中,所有任务都在主线程上执行。任务执行过程分为同步任务和异步任务两个阶段。异步任务的处理经历两个主要阶段:Event Table(事件表)和 Event Queue(事件队列)。Event Table存储了宏任务的相关信息,包括事件监听和相应的回调函数。当特定类型的事件发生时,对应的回调函数被添加到事件队列中,等待执行。例如,你可以通过addEventListener来将事件监听器注册到事件表上。
执行流程图
事件循环
- 概念:在事件循环中,当主线程执行完当前的同步任务后,会检查事件队列中是否有待处理的事件。如果有,主线程会取出事件并执行对应的回调函数。这个循环的过程被称为事件循环(Event Loop),它由主线程和任务队列两部分组成。主线程负责执行同步任务,而异步任务则通过任务队列进行处理。这种机制保证了异步任务在适当的时机能够插入执行,从而实现了JavaScript的非阻塞异步执行。
- 执行步骤:
事件循环的tick机制是指事件循环在每个迭代中执行的操作。一个tick通常包括以下步骤:
执行栈清空:JavaScript引擎首先执行执行栈中的所有同步任务。
微任务执行:执行栈清空后,事件循环会执行所有可用的微任务。
宏任务执行:微任务执行完毕后,事件循环会从宏任务队列中取出一个任务并执行。
渲染更新:在浏览器环境中,UI渲染可能会在每个tick之后发生,以更新浏览器界面。
概括
js有两种任务,同步任务和异步任务;异步任务通过任务队列机制来执行代码;任务队列里面分微任务和宏任务。宏任务是由宿主发起的,而微任务由JavaScript自身发起。
微任务:promise process.nextTick() Proxy MutaionObserver
宏任务:setTimeout \ setInterval \ setImmediate \ I/O \ UI交互 、 DOM事件 、 网络请求