一般我们屏幕的帧率是每秒60帧,也就是60fps,但是某些事件触发的频率超过了这个数值,比如 wheel, mousewheel,mousemove,pointermove,touchmove,这些连续性的事件一般每 秒会触发60~120次,假如每一次触发事件都将事件发送到主线程处理,由于屏幕的刷新速率相对 来说较低,这样使得主线程会触发过量的命中测试以及JS代码,使得性能有了没必要的损耗。 出于优化的目的,浏览器会合并这些连续的事件,延迟到下一帧渲染是执行,也就是 requestAnimationFrame之前。 问题:防抖、节流

    1. function debounce(callback,wait){
    2. let timerId = null;
    3. return function(event){
    4. if (timerId !== null){
    5. clearTimeout(timerId);
    6. }
    7. timerId = setTimeout(()=>{
    8. callback.call(this,event);
    9. timerId = null;
    10. },wait)
    11. }
    12. }
    13. document.querySelector('input').addEventListener('keydown',debounce(function(e){
    14. console.log(this.value)
    15. },500))
    1. function throttle(callback,wait){
    2. let start = 0;
    3. return function(event){
    4. let now = Date.now();
    5. if (now - wait > start){
    6. callback.call(this,event);
    7. start = now;
    8. }
    9. }
    10. }
    11. window.addEventListener('scroll',throttle(function(e){
    12. console.log(Date.now());
    13. },500))