Skip to main content

事件循环

是什么?

  • 处理程序中多个块的执行,且执行每块时调用 JavaScript 引擎,这种机制被称为事件循环。——《你不知道的Javascript中卷》
  • “事件” (JavaScript 代码执行)——《你不知道的Javascript中卷》

能干啥?

  • 事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。——MDN

工作原理

const queue=[];
let event;

while(true){
if(queue.length>0){
event=queue.shift();
try{
event();
}catch(error){
reportError(error)
}
}
}

关联知识

栈(Stack)

是什么?——函数调用形成了一个由若干堆叠而成——MDN

  • 帧中包含函数的参数和局部变量。(帧就是阮一峰老师提到的同步任务)

  • 每个函数被调用时,会产生一个帧压入栈顶。

  • 帧的弹出时机——函数执行完毕返回时,顶部帧会被弹出栈。

    ⚠️注意:

    • 帧被弹出其参数和局部变量可能继续存在。(可能是闭包导致的)
    • 这些未被销毁的参数和变量 仍能被任意的嵌套函数访问——MDN

堆(Heap)

  • 对象被分配在堆中,用来表示一大块(通常是非结构化的)内存区域的计算机术语。——MDN

队列(Queue)

  • JavaScript 运行时包含一个待处理消息的消息队列。每一个消息都关联着一个用以处理这个消息的回调函数。——MDN

  • 执行顺序:先进先出。

  • 存储异步任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。——阮一峰

权威内容