js面试题

64 阅读1分钟

延迟执行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()
   })
}