Js运行机制Event Loop

一 JS运行机制:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

JavaScript是单线程运行的(防止多个线程操作DOM,无法判断以哪个线程为准),HTML5提出WebWorker可以创建子线程,该线程完全受控制与主线程,且不能操作DOM(子线程可用于计算复杂数据)。

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。JavaScript分为同步任务(synchronous)与异步任务(asynchronous)

  • 同步任务在主线程上执行,形成执行栈(execution context stack);
  • 主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
  • 一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
  • 主线程不断重复上面的第三步。

 

二 JS异步任务:指的是不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

异步任务分为:

1 宏任务:宏任务就是将当前任务放在下一个任务列最顶部。script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。

2 微任务:微任务会将当前任务放入下一个任务列的底部。Promises, Object.observe(已废弃;Proxy 对象替代), MutationObserver,process.nextTick(Node.js)

宏任务与微任务执行顺序

 

 推荐阅读:

Vue this.$nextTick原理剖析

 

 

posted @ 2021-03-17 16:44  TerryMin  阅读(70)  评论(0编辑  收藏  举报