最近看了一些异步的文章,有一些做者没有写代码也把错误的理解放上来。想一想,我也应该总结一些,以前面试也有过一道题目,虽说是考察异步,但其实就是考察异步当中的任务队列。给你一道题目,你以为会依次输出什么?git
console.log('1') Promise.resolve().then(() => console.log('2')) setTimeout(() => {console.log('3'); Promise.resolve().then(() => console.log('4'))}, 0) Promise.resolve().then(() => console.log('5')) setTimeout(() => console.log('6'), 0) console.log('7')
答案是github
1 7 2 5 3 4 6
若是你知道为何会输出这些的话,那我想你没必要看下面了,由于你也有大概的理解,若是没有的话,我就跟你分析一下吧。面试
先看一张图吧,是拿别人的,有部分缘由也是由于他写的文章有错误,我才总结。segmentfault
先理解这张图片吧,我简单介绍一下。markdown
而后,js运行就是运行主线程->运行任务队列异步
固然,这只是大概的介绍,真正的堆和栈并非和他说的同样,栈里面还有内存栈和调用栈,内存栈又有全局的内存栈,也有某个函数的内存栈,固然,函数内部的内存栈又放在了堆里面。这里面的栈,仅仅是表明了调用栈。函数
什么是宏任务队列?
宏任务队列macrotasks: setTimeout, setInterval, setImmediate, I/O, UI renderingoop
上面的基本操做就是宏任务队列spa
微任务队列microtasks: process.nextTick, Promise, MutationObserver线程
上面的基本操做就是微任务队列
我就简单的说一下js里面执行顺序吧:
是否是很简单?
那么上面那道题的结果无非就是
// 一开始,主线程 console.log('1'); console.log('7'); // 下一步,主线程 Promise.resolve().then(() => console.log('2')) // 下一步,主线程 Promise.resolve().then(() => console.log('5')) // 下一步,主线程 setTimeout(() => {console.log('3')}, 0) // 下一步,主线程 Promise.resolve().then(() => console.log('4')) // 下一步,主线程 setTimeout(() => console.log('6'), 0)
看了一下不少文章,觉得很难,很想画图,可是在写的过程当中,发现其实真的很简单,只要好好了解js里面的引擎就行了,js仍是一个很强大的单线程语言。