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