其最初的用途来决定的:与浏览器交互。
试想一下 如果javascript是多线程的,那么当两个线程同时对dom进行一项操作,例如一个向其添加事件,而另一个删除了这个dom,此时该如何处理呢?因此,为了保证不会 发生类似于这个例子中的情景,javascript选择只用一个主线程来执行代码,这样就保证了程序执行的一致性。
一切javascript版的"多线程"都是用单线程模拟出来的,一切javascript多线程都是纸老虎!
JavaScript的事件分两种,宏任务(macro-task)和微任务(micro-task)
微任务:Promise.then(非new Promise),process.nextTick(node独有),Object.observe(废弃), MutationObserver
2个微任务的优先级,==promise高于async==
事件的执行顺序的基础是 ==先执行宏任务,后执行微任务==
任务可以有同步任务和异步任务,同步和异步任务分别进入不同的执行"场所"
宏任务和微任务是不同的Event Queue);setTimeout(function() {
console.log('setTimeout');
},1000)
new Promise(function(resolve) {
console.log('promise');
}).then(function() {
console.log('then');
})
console.log('console');
的事件队列),即setTimeout的回调函数,然后查找是否有微任务,没有,事件循环结束事件循环,先执行宏任务,其中同步任务立即执行,异步任务,加载到对应的的Event Queue,所有同步宏任务执行完毕后,如果发现微任务的Event Queue中有未执行的任务,会先执行其中的任务,这样算是完成了一次事件循环。接下来查看宏任务的Event Queue中是否有未执行的任务,有的话,就开始第二轮事件循环,依此类推。
<script>
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2');
}
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
async1();
new Promise(function(resolve) {
console.log('promise1');
resolve();
}).then(function() {
console.log('promise2');
});
console.log('script end');
</script>
// script start => async1 start => async2 => promise1 => script end => promise2 => async1 end => setTimeout
遇到setTimeout() ,把它的回调函数放入宏任务(setTimeout1)。
| 宏任务 | 微任务 |
|---|---|
| setTimeout1 |
看到console.log输出async2,之后没有返回值,结束函数,返回undefined,返回async1的执行上下文的await undefined,由于async函数使用await后得语句会被放入一个回调函数中,所以把下面的放入微任务中。
| 宏任务 | 微任务 |
|---|---|
| setTimeout1 | async1=> awati 后面的语句 |
结束async1,返回全局上下文,遇到Promise构造函数,里面的函数立马执行, 输出promise1, 之后的回调函数进入微任务
| 宏任务 | 微任务 |
|---|---|
| setTimeout1 | async1=> awati 后面的语句 |
| ` ` | new Promise() => 后的then |
看到async1中await后面的回调函数,执行代码,输出async1 end
| 宏任务 | 微任务 |
|---|---|
| setTimeout1 | 空 |
此时微任务中的队列为空,开始执行队列中的宏任务,进入一个新的代码块。遇到console.log,输出setTimeout
原文链接:https://www.jianshu.com/p/de7aba994523
原文:https://www.cnblogs.com/topyang/p/11411571.html