JavaScript是一个单线程语言。
任务分为同步任务和异步任务。
同步任务就是立即执行的任务,同步任务会进入主线程立即执行,当浏览器遇到异步任务时,会将异步任务扔到异步队列中去,等同步任务执行完毕后,再按照“微先宏后”的执行顺序依次执行异步任务。
“微先宏后”就是在异步任务队列中微任务先执行,宏任务后执行。
微任务包括:promise
宏任务包括:setTimeout、setInterval、UI交互、IO、script整体代码
下面来看面试题,先看题目,思考后有自己的想法再看题目结果,有不懂的再看解析。
目录
第一题
原题
var promise=new Promise((resolve)=>{
console.log("promise start...");
resolve("promise");
})
promise.then((val) => {
console.log(val);
})
setTimeout(()=>{
console.log("settimeout");
})
console.log("test end...");
结果
解析
//第一题
var promise=new Promise((resolve)=>{
console.log("promise start...");
resolve("promise");
})
promise.then((val) => {
console.log(val);
})
setTimeout(()=>{
console.log("settimeout");
})
console.log("test end...");
//先执行promise内部的代码,遇到异步任务将异步任务扔到异步队列里,先处理同步任务;
//异步任务有:then setTimeout 异步任务队列中先执行微任务,再执行宏任务
//执行顺序: promise start...->test end...->promise->settimeout
第二题
原题
//第二题
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();
console.log("promise3");
}).then(function(){
console.log("promise2");
})
console.log("script end");
结果
解析
//第二题
async function async1(){
console.log("async1 start");
await async2();
//await后面是个异步方法
console.log("async1 end");//异步1
}
async function async2(){
console.log("async2");
}
//函数定义的时候不执行,但是在函数调用的时候函数体内部的代码才会执行。
console.log("script start");
//定时函数
setTimeout(function(){
console.log("settimeout");//异步3
},0)//宏任务后执行
async1();
new Promise(function(resolve){
console.log("promise1");
resolve();
console.log("promise3");
}).then(function(){
console.log("promise2");//异步2
})
console.log("script end");
//async 可以单独使用 但是await要和async搭配使用 async和await是一对多的关系,即一个async可以有多个await
//async和await是promise的语法糖,比promise语法更简洁更好用。
第三题
原题
//第三题
var promise=new Promise(resolve=>{
console.log(1);
resolve()
})
setTimeout(()=>{
console.log(2);
})
promise.then(()=>{
console.log(3);
})
var promise2=getPromise();
async function getPromise(){
console.log(5);
await promise;
console.log(6);
}
console.log(8);
结果
解析
//第三题
var promise=new Promise(resolve=>{
console.log(1);
resolve()//异步
})
setTimeout(()=>{
console.log(2);//异步 最后一个setTimeout
})
promise.then(()=>{
console.log(3);
})
var promise2=getPromise();
async function getPromise(){
console.log(5);
await promise;//await 一个promise对象 异步 promise.then
console.log(6);
}
console.log(8);
欢迎点赞、关注、收藏~