![[思考]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_15.f58c082.png)
我们所谓的宏任务与微任务的最大的区别就是,每一个宏任务执行完之后都会把控制权交给浏览器,浏览器就会根据情况决定是否进行渲染,而微任务执行完之后如果还存在微任务则不会把控制权交给浏览器,而是继续执行微任务,直到所有的微任务执行完毕才把控制权交给浏览器,从这个角度看 requestAnimationFrame 就是个宏任务。
因为每个 requestAnimationFrame 执行完也都会把控制权交给浏览器,也正是因为这个特点,才有些文章提倡可以使用 requestAnimationFrame 进行大数据渲染的性能优化,而不是使用微任务。
requestAnimationFrame 本身的设计就是在每一帧渲染完准备显示之前去执行的,也就是 requestAnimationFrame 执行的时候浏览器本身就准备显示新的内容了,如果 requestAnimationFrame 像微任务那样执行完不把控制权交还给浏览器,那么这个设计就不合理了,所以 requestAnimationFrame 的设计天然就是执行完之后就需要把控制权交还给浏览器,让浏览器去渲染新一帧的内容。
其实 requestAnimationFrame 进行大数据渲染的性能优化也并不是最优的方案,最优的方案还是 React 中的时间分片方案。
当然现在也有人说,浏览器不区分所谓宏任务与微任务了,都叫任务队列,只是这些任务有执行先后的优先级,但不管怎么分,所有的任务都可以以执行完之后是否把控制权交还给浏览器进行区分。
因为每个 requestAnimationFrame 执行完也都会把控制权交给浏览器,也正是因为这个特点,才有些文章提倡可以使用 requestAnimationFrame 进行大数据渲染的性能优化,而不是使用微任务。
requestAnimationFrame 本身的设计就是在每一帧渲染完准备显示之前去执行的,也就是 requestAnimationFrame 执行的时候浏览器本身就准备显示新的内容了,如果 requestAnimationFrame 像微任务那样执行完不把控制权交还给浏览器,那么这个设计就不合理了,所以 requestAnimationFrame 的设计天然就是执行完之后就需要把控制权交还给浏览器,让浏览器去渲染新一帧的内容。
其实 requestAnimationFrame 进行大数据渲染的性能优化也并不是最优的方案,最优的方案还是 React 中的时间分片方案。
当然现在也有人说,浏览器不区分所谓宏任务与微任务了,都叫任务队列,只是这些任务有执行先后的优先级,但不管怎么分,所有的任务都可以以执行完之后是否把控制权交还给浏览器进行区分。
展开
1
5