技术实践

JavaScript事件循环

执行栈是有大小的,当入栈的执行环境超过一定数目,或达到最大调用深度,就会出现栈溢出(Stack Overflow)的问题,这在递归代码中很容

羊先生的头像
羊先生2022.12.29 · 4 分钟阅读 · 88 阅读
JavaScript事件循环封面
文章正文还需 4 分钟

JavaScript的任务分为两种同步和异步:

同步任务: 在主线程上排队执行的任务,只有一个任务执行完毕,才能执行下一个任务,
异步任务: 不进入主线程,而是放在任务队列中,若有多个异步任务则需要在任务队列中排队等待,任务队列类似于缓冲区,任务下一步会被移到执行栈然后主线程执行调用栈的任务。

执行栈

执行栈(Execution Stack),也称为执行上下文栈(Execution Context Stack),在其他编程语言中也被叫做调用栈(Call Stack),在 ECMAScript 文档里是叫 Execution Context Stack,但本质上是同一个的东西的不同名称

它是一种用来管理执行环境的数据结构,存储了在代码执行期间创建的所有执行环境。因为是栈,所以遵循 LIFO(先进后出)的原则。

当 JavaScript 引擎首次读取你的脚本时,它会创建一个全局执行环境并将其推入当前的执行栈底部。每当发生一个函数调用,引擎都会为该函数创建一个新的执行环境并将其推到当前执行栈的顶端。

引擎会运行执行环境在执行栈顶端的函数,当此函数运行完成后,其对应的执行环境将会从执行栈中弹出,上下文控制权将移到当前执行栈的下一个执行环境。

执行栈是有大小的,当入栈的执行环境超过一定数目,或达到最大调用深度,就会出现栈溢出(Stack Overflow)的问题,这在递归代码中很容易出现

js 复制代码
function division(a,b){
    return division(a,b)
}
console.log(division(1,2))

理解JS执行环境

任务队列

宏任务:script(全局任务), setTimeout, setInterval, setImmediate, I/O, UI rendering.
微任务:process.nextTick, Promise, Object.observer, MutationObserver.

image.png