javascript是单线程的
写一下出现定时器时候的处理过程
现在栈结构中,全局上下文处理13-15行代码
遇到settimeout时,创建 settimeout执行上下文,然后调用另外一个线程去计时,此时可看做此上下文完成,消除 settimeout执行上下文
最后全局上下文为空
当定时结束,会在事件队列中放入任务,这个地方是 回调函数
全局执行上下文会查看队列中是否有任务,如果有就拿过来执行
- setTimeout(()=>{
- console.log(111);
- },0)
-
-
- new Promise((resovle,reject)=>{
- console.log(11111);
- console.log(22222);
- resovle(00000)
- console.log(33333);
- }).then((res)=>{
- console.log(res);
-
- })
-
- console.log(44444 );
这个地方settimeout和than函数都会放入时间队列,故他们两个是执行最后的
但是放入的队列不同
settimeout是宏任务macrotask,会加入宏任务队列。than是微任务micrsoft,加入微任务队列
现在有一个问题,当栈中的全局上下文是空的时候,宏任务队列和微任务队列都有任务,应该这么操作?
机制是,将微任务全部做完,再去做宏任务
看个面试题
代码顺序是从左到右
面试题2
面试题3
这里 then1-res和getdata end这两行其实是微任务,因为await返回了一个promise,后面的代码相当与调用了then
面试题4