事件循环(Event Loop)

单线程的原因

单线程与之用途有关,单线程能够保证一致性,如果有两个线程,一个线程点击了一个元素,另一个删除了一个元素,浏览器以哪一个为准?

单线程指的是单个脚本只能在一个线程上运行,而不是 JavaScript 引擎只有一个线程。

Event Loop

  • Javascript是单线程的,所有的同步任务都会在主线程中执行。

  • 主线程之外,还有一个任务队列。每当一个异步任务有结果了,就往任务队列里塞一个事件。

  • 当主线程中的任务,都执行完之后,系统会 “依次” 读取任务队列里的事件。与之相对应的异步任务进入主线程,开始执行。

  • 异步任务之间,会存在差异,所以它们执行的优先级也会有区别。大致分为 微任务(micro task,如:Promise、MutaionObserver等)和宏任务(macro task,如:setTimeout、setInterval、I/O等)。同一次事件循环中,微任务永远在宏任务之前执行。

  • 主线程会不断重复上面的步骤,直到执行完所有任务。