javaScript语言特点是单线程
前期介绍
调用栈(call Stack):存储执行上下文。
任务队列(task queue):用于存储待执行的异步任务(宏任务(macro Task)和微任务(micro Task)),先进先出的队列。
宏任务(macro Task):比如 setTimeout、setInterval、I/O操作等。
微任务(micro Task):比如Promise的.then或.catch 、MutationObserver(监视dom树API)。
事件循环(event Loop):持续监听执行栈和任务队列的状态。(例如setTimeout (() =>{},0)等待最少4毫秒后得到执行条件成立放入(event queue)规定setTimeout虽然设置0毫秒后执行,但是间隔时间最短是4毫秒,最少要4毫秒)。
事件表格(event Table):记录准备放入evet queue的任务。
执行顺序
在主线程上执行栈执行的任务有两种分别是同步任务和异步任务。
同步任务:顺序在执行栈执行,只有前一个任务执行完毕才会执行下一个任务
异步任务:分为宏任务(macroTask)和微任务(microTask),微任务的执行优先级要比宏任务高。在碰到异步任务的时候会放入event table,当event table 中有异步任务得到被执行回调函数后,推入任务队列(task queue) 通过事件循环(even loop),检测在同步任务的执行栈执行完毕,执行栈为空时会读取任务队列来执行完成的异步任务。
运行机制
1.在主线程同步任务创建执行栈开始执行,
2.遇到异步任务时放入任务队列