延迟执行js代码
正常情况:html解析,碰到script标签,加载并执行,这时会阻塞html的解析,等js执行完再解析html
加载js代码和解析html同时进行,解析完html再执行js
加载js代码和解析html同时进行,加载js完毕后执行,这时会阻塞html解析
事件循环
1.执行同步代码,并将异步任务分发到宏任务队列和微任务队列
2.执行所有微任务,清空微任务队列
3.执行一个宏任务
步骤2和3循环进行,称为事件循环
异步任务分为宏任务和微任务
宏任务:setTimeout、setInterval
微任务:Promise.then
setTimeout(()=>{}, 0) 在项目中一般有几个常见用途,本质上是把一个任务放到当前调用栈清空后、事件循环的下一轮再执行。
如果宏任务或者微任务用时过长,会阻塞渲染,导致丢帧的情况
浏览器在等待所有任务(宏 + 微)执行完之后才会渲染,如果这些任务执行时间太长,就会错过本该渲染的时机(vsync 信号),只能等到下一帧甚至更晚去绘制。
这时视觉上就会出现掉帧(比如动画卡顿、滚动不流畅)。
requestAnimationFrame(fn)(下一帧渲染前)
闭包
闭包指能够访问外层函数局部变量的函数,即使外层函数已经执行完毕。 使用场景:接口重试机制
// 封装接口重试函数
function retryFn(apiFunc,maxCount,delay){
return new Promise((resolve,reject)=>{
let count = 0 //记录接口重试次数
function makeRequest(){
count++
apiFunc().
then(resolve).
catch((error)=>{
if(count>=maxCount){
reject(error)
}else{
setTimeout(makeRequest,delay)
}
})
}
makeRequest()
})
}