前端问题清单——JavaScript的执行

79 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

前提认知:JavaScript在执行时,JavaScript引擎会常驻在内存中。

什么是宏任务?

宿主发起,传递给JavaScript引擎一段代码,JavaScript引擎按照顺序执行,这种任务被称为宏任务。

什么是微任务?

ES5之后,JavaScript引入了Promise,不需要宿主环境,JavaScript引擎本身也能发起任务,这种由JavaScript引擎发起的任务被称为微任务。

Promise

Promise是一种标准的异步管理方式。在没有Promise之前,JavaScript本身没有执行异步代码的能力。

方式大概可以理解为异步的函数,不返回真实结果,只返回一个承诺,然后可以在一个合适的时机兑现这个承诺。

let p = new Promise((resolve, reject)=>{
    console.log('111')
    resolve()
})
p.then(()=>{
    console.log('222')
})
console.log('333')
// 输出结果为
111
333
222

从上面这个例子中可以看出,then回调是一个异步过程,当多个Promise嵌套的时候,就会不断的回调,从而陷入回调陷阱。

于是,在ES6中,增加了async/await,可以有效改善代码结构。

async/await

async/await的运行时基础是Promise

async函数:在function关键字之前加关键字async,这样就定义了一个async函数,async的返回值是Promise

await可以等待一个Promise

基于以上特性,async就可以嵌套了,利用async函数组合出新的async函数。所以,在使用async函数的时候,开发者可以不那么了解Promise也可以实现异步编程。

什么是事件循环?

事件循环是宏任务的事件循环,JavaScript引擎是在等待宿主环境分配任务,类似操作系统的轮询,等待分配任务,分配到任务就执行。当收到的多个任务的时候,事件循环会维护一个宏任务队列。所以JavaScript引擎每次执行都是在执行一个宏任务,在JavaScript引入了微任务后,宏任务中就可能包含一个微任务队列。在当前执行的宏任务中的微任务没有完成前,不会执行下一个宏任务。

总结

最常见的面试题之一就是判断函数的执行顺序,希望看完本文可以对事件循环、各类任务有更多的理解。