⾸先js是单线程运⾏的,在代码执⾏的时候,通过将不同函数的执⾏上下⽂压⼊执⾏栈中来保证代码的有序执⾏。 在执⾏同步代码的时候,如果遇到了异步事件,js引擎并不会⼀直等待其返回结果,⽽是会将这个事件挂起,继续执⾏ 执⾏栈中的其他任务 所有任务可以分成两种,⼀种是同步任务(synchronous),另⼀种是异步任务(asynchronous)。
同步任务指的是,在主线程上排队执⾏的任务,只有前⼀个任务执⾏完毕,才能执⾏后⼀个任务;
异步任务指的是,不进⼊主线程、⽽进⼊"任务队列"(task queue)的任务,只有等主线程任务执⾏完毕,"任务队 列"开始通知主线程,请求执⾏任务,该任务才会进⼊主线程执⾏。
当同步事件执⾏完毕后,再将异步事件对应的回调加⼊到与当前执⾏栈中不同的另⼀个任务队列中等待执⾏。 任务队列可以分为宏任务对列和微任务对列,当当前执⾏栈中的事件执⾏完毕后,js 引擎⾸先会判断微任务对列中是 否有任务可以执⾏,如果有就将微任务队⾸的事件压⼊栈中执⾏。 当微任务对列中的任务都执⾏完成后再去判断宏任务对列中的任务。
异步运⾏机制如下:
(1)所有同步任务都在主线程上执⾏,形成⼀个执⾏栈(execution context stack)。
(2)主线程之外,还存在⼀个"任务队列"(task queue)。 只要异步任务有了运⾏结果,就在"任务队列"之中放置⼀个事件。 arguments 的对象 V8 引擎的垃圾回收机制 垃圾回收机制的两种⽅法
(3)⼀旦"执⾏栈"中的所有同步任务执⾏完毕,系统就会读取"任务队列",看看⾥⾯有哪些事件。 那些对应的异步任务,于是结束等待状态,进⼊执⾏栈,开始执⾏。
(4)主线程不断重复上⾯的第三步。
标签:异步,队列,主线,js,任务,栈中,原理,机制,对列 From: https://blog.csdn.net/2201_75773271/article/details/141108381