javascript一门单线程的非阻塞的脚本语言。当用户进行点击元素,又进行元素移除,这样就会致使哪一个事件的优先级不知道,因此JS必须是单线程的。为了协调事件,用户交互,脚本,UI渲染,和网络处理,Event Loop能够防止主线程阻塞。在某些花费时间较长的事件,浏览器会将它们挂起(pending),事件等待被执行,事件循环是经过任务队列实现的。javascript
one thread == one callback == one thing at a time.java
栈是一种遵循后进先出(LIFO)的数据集合,新添加或待删除的元素都保存在栈的末尾,称做栈顶,另外一端称做栈底。在栈里,新元素都靠近栈顶,旧元素都靠近栈底web
队列是一种遵循先进先出(FIFO)的数据集合,新的条目会被加到队列的末尾,旧的条目会从队列的头部被移出。ajax
能够这样理解,有两个队列—— 执行队列(同步任务synchronous)、事件队列(异步任务asynchronous),存放全部着JS执行的任务(ajax、点击事件、UI渲染等、promise.then)。promise
运行Js代码,从上往下执行代码,同步代码,依次执行,遇到异步代码,则根据其任务类型,添加到相应的对应队列,宏任务放入事件队列,微任务放于执行队列以后(可是会是某个事件循环的最后),事件队列(任务)以前。这个处理事件过程是不断循环的,只要主线程空了,就会去读取"任务队列"而且执行。浏览器
<script>
console.log('script start');
setTimeout(function() {
console.log('timeout1');
}, 0);
new Promise(resolve => {
console.log('promise1');
resolve();
setTimeout(() => {
console.log('timeout2');
new Promise(resolve => {
resolve();
}).then(function() {
console.log('then3')
})
}, 0);
}).then(function() {
console.log('then1')
})
new Promise(resolve => {
resolve();
}).then(function() {
console.log('then2')
})
console.log('script end');
</script>
复制代码