JavaScript 是一门单线程语言, 之所以说是单线程, 是因为在浏览器中, 如果是多线程, 并且两个线程同时操作了同一个 Dom 元素, 那最后的结果会出现问题. 所以, JavaScript 是单线程的, 但是如果完全由上至下的一行一行执行代码, 假如一个代码块执行了很长的时间, 后面必须要等待当前执行完毕, 这样的效率是非常低的, 所以有了异步的概念, 确切的说, JavaScript 的主线程是单线程的, 但是也有其他的线程去帮我们实现异步操作, 比如定时器线程, 事件线程, Ajax 线程.
1. 所有的同步任务都在主线程上执行, 形成一个执行栈
2. 主线程之外, 还存在一个 ` 任务队. 只要异步任务有了运行结果, 就在 ` 任务队列 ` 之中放置一个事件.
3. 一旦执行栈中的所有同步任务执行完毕, 系统就会读取 ` 任务队列 ` 看看里面有些什么事件, 那些对应的异步任务就结束等待状态, 进入执行栈, 开始执行
4. 主线程不断重复上面的第三步, 只要主线程空了, 就会读取 ` 任务队列 ` 这就是 JavaScript 的运行机制, 这个过程会不断重复.(该过程又称为事件轮询)
5. 在 JS 中的 ES6 的任务队列比循环中的任务队列优先级要高, promise 则属于 ES6 的任务队列, 所以根据其优先级, 系统执行完同步任务之后, 最先进入执行栈的是 promise, 其次才是循环中的任务事件
来源: http://www.bubuko.com/infodetail-3029450.html