本系列文章是博主精心整理的面试热点问题,吸收了大量的技术博客与面试文章,总结多年的面试经历,带你快速建立前端面试知识体系。抓住每一场面试的机会,知己知彼才能百战百胜!
JS 的特色就是异步编程,所有有很多关于异步的考点,本章都会讲解。如 event loop、promise、async-await、微任务和宏任务。学不会这些,就不算是精通 JS。
event loop,也叫事件循环/事件轮询,JS是单线程运行的,从前到后,一行一行执行,如果某一行执行报错,则停止下面的代码执行,先把同步代码执行完,再执行异步,异步要基于回调来实现,event loop 就是异步回调的实现原理。
同步代码,一行一行放在 Call Stack 执行
遇到异步,会先“记录”下,等待时机(定时,网络请求等)
时机到了,就会移动到 Callback Queue
如果 Call Stack 为空(即异步代码执行完)Event loop 开始工作
轮训查找 Callback Queue,如有则移动到 Call Stack 执行
然后继续轮询查找(永动机一样)
promise 有三种状态,分别是:pending
(初始化状态)、resolved
(成功状态)、rejected
(失败状态)
pending ->resolved
或 pending->rejected
变化不可逆
pending状态,不会触发then和catch
resolved状态,会触发后续的then回调函数
rejected状态,会触发后续的catch回调函数
reslove只会触发then的回调,不会触发catch
reject只会触发catch的回调,不会触发then
then正常返回resolved,里面有报错则返回rejected
catch正常返回resolved,里面有报错则返回rejected
解决异步回调callback hell(回调地狱),Promise then catch 链式调用,但也是基于回调函数,async/await是用同步语法编写异步代码,是同步语法,彻底消灭回调函数,是异步写法的最佳解决方式,是消灭异步回调的终极武器。
注意:async/await和promise不冲突。
await相当于Promise的then
try…catch可捕获日常,代替了Promise的catch
写法一:
!(async function(){
//同步的语法
const img1 = await loadImg(src1)//await 必须用async函数包裹
cosole.log(img1.height,img.width)
const img2 = await loadImg(src2)
cosnole.log(img.height,img2.width)
}) ( )
写法二:
async function loadImg1() {
const img1 = await loadImg(src1)
return img1
)
宏任务和微任务是event Loop中的两种任务,分别处在两种任务队列中。微任务是ES6语法规定的,宏任务是浏览器规定的。
setTimeout,setInterval, Ajax, DOM事件;
Promise async/await
微任务执行时机比宏任务要早