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)
推荐阅读: