js为什么是单线程的?单线程的js是怎么实现异步的?

问题一:多线程的js操作同一个DOM,会造成浏览器的执行冲突(比如:一个删除,一个修改)。
问题二:通过事件循环机制(EventLoop)实现异步;

EventLoop

JS是单线程的,主线程拥有一个执行栈和执行队列。主线程自上而下依次执行代码,并判断函数是同步的还是异步的,同步的函数直接在主线程中执行,异步函数塞入执行队列。当主线程的函数执行完毕后,再将异步函数从执行队列中出栈,直到执行完毕。

macrotasks:

  • setTimeout
  • setInterval
  • setImmediate
  • requestAnimationFrame
  • I/O
  • UI rendering

microtasks:

  • process.nextTick
  • Promises
  • Object.observe
  • MutationObserver

==microtask的执行优先级高于macrotask==

clipboard.png

clipboard.png

浏览器和Node的执行顺序不一样,上述规则适用于浏览器


millzhang
127 声望46 粉丝

不大不小的年纪满怀着各种各样的抱负踽踽独行着.