JS、浏览器——栈和队列(事件循环相关)
调用栈Call Stack这是一个栈LIFO后进先出结构记录当前正在执行的函数。它属于执行上下文管理知识。任务队列Task Queue这是一个队列FIFO先进先出结构存放等待执行的回调函数。它属于调度策略知识。它们共同组成了事件循环的两个核心角色“栈”负责当前做什么“队列”负责接下来要做什么。在这里我们只学习栈和队列的相关内容涉及到事件循环的知识可移步我的另一篇文章【浏览器——事件循环】一、js引擎执行代码过程引擎先执行所有同步代码填满并清空调用栈。遇到异步API如setTimeout、fetch引擎不等待直接交给Web APIs浏览器提供去处理处理后的回调函数会放在队列中等待调用自己继续执行后续代码。当调用栈完全清空后事件循环才会从任务队列中取出回调函数压入调用栈执行。二、任务队列任务队列包含两类微任务队列和宏任务队列。宏任务由宿主环境浏览器/Node发起的任务微任务由 JS 引擎自身发起的任务优先级高于宏任务宏任务微任务setTimeoutsetIntervalsetImmediateNodeI/O操作UI 渲染MessageChannel...Promise.then()/catch()/finally()async/await实质是 PromiseMutationObserver浏览器process.nextTickNode优先级最高...三、执行机制记住这句口诀“一个宏任务一筐微任务”。在每一轮事件循环中执行机制是这样的从宏任务队列中取出一个最旧的任务执行。执行完毕后检查微任务队列。清空执行完微任务队列中的所有任务。进入下一轮循环再取下一个宏任务。关键点微任务会在下一个宏任务开始之前全部执行完毕。