什么是防抖和节流?有什么区别?如何实现?

2022-08-30  本文已影响0人  谁的小羊跑了

概念:

本质上是优化高频率执行代码的一种手段

相同点:
不同点:

假设:都设置时间频率为500ms,在2秒时间内,频繁触发函数,节流,每隔 500ms 就执行⼀次。防抖,则不管调动多少次⽅法,在2s后,只会执行⼀次

应用场景

防抖:

节流:

实现

可以利用时间戳或定时器的方式
防抖:定时器
节流:定时器或时间戳都可以

 let box=document.querySelector('.box')
 let i=1;
 box.innerHTML=i;

事件对象.addEventListener('事件类型',debounce(moveFn),false)

   function moveFn() {
        this.innerHTML=++i
   }

    //通过防抖实现优化
    function debounce(fn,time=1000) {
        let timer=null;
        return function() {
            let _this=this
            let args=arguments
            clearTimeout(timer)
            timer=setTimeout(function() {
                fn.apply(_this,args)
            },time)
        }
    }
let box=document.querySelector('.box')
    let i=1;
    box.innerHTML=i;
    box.addEventListener('mousemove',throttle(moveFn,2000),false)
    function moveFn(e) {
        this.innerHTML=++i
    }
    //实现节流-定时器
    function throttle(fn,time) {
        let timer=null;
        return function() {
            let _this=this
            let args=arguments
            if(!timer) {
                timer=setTimeout(function() {
                    timer=null
                    fn.apply(_this,args)
                },time)
            }
        }
    }

2.事件戳方式

let box=document.querySelector('.box')
    let i=1;
    box.innerHTML=i;
    box.addEventListener('mousemove',throttle(moveFn,5000),false)
    function moveFn(e) {
        this.innerHTML=++i
    }
    //实现节流-时间戳版本  
    //思路:用现在时间减去上一次的时间>=time,就调用!
    function throttle(fn,time=1000) {
        //上一次的时间
        let previus=0
        return function() {
            let _this=this;
            let args=arguments
            //生成当前时间
            let now=+new Date()
            if(now-previus>=time) {
                fn.apply(_this,args)
                previus=now
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读