事件循环 - js是单线程非阻塞的,一次只能执行一个任务,可以简单的看做是一个死循环,有任务的时候会执行任务,没有任务的时候进入休眠状态。
而任务可以分为 :
同步任务 -- js代码 Promise中的代码
异步任务 -- 宏任务 -- settimeout setinterval i/o操作 dom事件
-- 微任务 -- promise的then中的代码 async/await的后面代码
特殊任务 -- requestAnimationFrame 专为动画api (他会在渲染的每帧前执行 精准)
-- requestIdleCallback 空闲时间执行(加载日志等)
-- web worker 浏览器实现的多线程api
微任务优先级高于宏任务!
js执行时,一段代码被压入调用栈(call stack) 当代码(同步任务-js代码)执行完毕后,看微任务队列有没有任务,清空微任务后,看宏任务队列,执行一个宏任务后,再看微任务队列,有则清空,如此循环。
特殊任务:requestAnimationFrame是执行完一个宏任务和清空微任务后 如果浏览器有渲染需求 则会先执行他的回调 后渲染
requestIdleCallback 如果还有空闲时间 执行这个回调
继续进入事件循环