setTimeout(function(){console.log(1);},0)new Promise(function execulor(resolve){console.log(2)for(var i = 0;i<10000;i+=1){i ==9999 && resolve()}console.log(3)}).then(function(){console.log(4)})console.log(5)
以上代码的执行结果为
2 3 5 4 1
event loop 事件循环 执行队列
javascript 是单线程的 线程中的任务分为 同步任务和异步任务 异步任务分为宏队列任务(setTimeout ,setIntervar 和 IO) 和 微队列任务(**Promise、MutaionObserve等**)
javascript 执行顺序如下
1、首先执行完所有的同步任务
2、执行完后清空调用栈
3、**将位于微队列队首的任务拿出来放到执行栈中
4、继续执行微队列中的任务 直到执行完毕 (若中途新加入微队列任务 则放到对末尾执行)
5、执行完后调用栈内容清空 微队列任务也为空
6、取出宏队列队首任务执行
7、执行完毕 调用栈为空
7、重复执行3-7**
依次可以得出上面的执行顺序
对于async/await async 和 awiat 相当于Promise
执行完 await 相当于 执行完resolve
async function fn1(){console.log(1)await fn2();console.log(2)}//相当于new Promise(function(resolve){console.log(1)fn2()resolve()}).then(function(){console.log(2)})
示例:
async function fn1(){console.log(1)await fn2();console.log(2)}function fn2(){console.log(3)}console.log(4)setTimeout(() => {console.log(5)}, 0);fn1();new Promise(function(resolve){console.log(6)resolve();}).then(function(){console.log(7)})console.log(8)
输出结果: // 4 1 3 6 8 2 7 5
