防抖

防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行

  1. /*
  2. * 滚动完后,多少秒执行一次
  3. * 通过 锁 和 闭包思路解决
  4. */
  5. // 不防抖 只要滚动就执行
  6. window.addEventListener('scroll', () => {
  7. console.log(1);
  8. });
  9. // 滚动防抖
  10. function debounce(fun, time) {
  11. let timeout = null;
  12. return function () {
  13. if (timeout !== null) {
  14. clearTimeout(timeout)
  15. }
  16. timeout = setTimeout(fun, time)
  17. }
  18. }
  19. // 处理函数
  20. function handle() {
  21. console.log(Math.random());
  22. }
  23. // 滚动事件
  24. window.addEventListener('scroll', debounce(handle, 10000))

节流

防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行

时间戳节流


let throttle = function(fun,delay){
    let prev = Date.now() //  时间戳  记录滚动钱的时间戳
    return function (){
        let _this =this;  //  保存this
        var args = arguments; //  保存 arguments
        let now = Date.now()  //  时间戳
        if(now - prev >= delay){  //  连续滚动的时间大于定好的时间
            fun.apply(_this,args);
            prev = Date.now();
        }
    }
}
function handle(){
    console.log(Math.random());
}
window.addEventListener('scroll',throttle(handle,1000))

定时器节流


let  throttle = function (fun,delay){
    let timer = null;
    return function (){
        let _this = this;
        let args = arguments;
        if(!timer){
            timer = setTimeout(function(){
                fun.apply(_this,args);
                timer = null;
            },delay)
        }
    }
}
function handle(){
    console.log(Math.random());
}
window.addEventListener('scroll',throttle(handle,1000))

定时器+时间戳


let throttle = function (fun, delay) {
    let timer = null;
    let startTime = Date.now(); //  开始时间
    return function () {
        let curTime = Date.now();
        let remaining = delay - (curTime - startTime) //  剩余时间
        let _this = this;
        let args = arguments;
        clearTimeout(timer);
        if (remaining <= 0) {
            fun.apply(_this, args);
            startTime = Date.now();
        } else {
            timer = setTimeout(fun, remaining) //  取消当前并计算新的
        }
    }
}
function handle() {
    console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000))