美文网首页
防抖debounce和节流throttle区别及手写实现

防抖debounce和节流throttle区别及手写实现

作者: Fairy_妍 | 来源:发表于2021-08-25 19:28 被阅读0次

    防抖和节流

    • 节流 函数在一段时间内的多次调用,只有第一次的调用生效。
    • 防抖 函数在一段时间内的多次调用,仅使得最后一次调用有效。

    节流防抖都是用来控制某些函数的调用频率。
    例如,在窗口resize的时候,由于可视区变大,我们可能需要向服务器请求更多内容来填充可视区。但可视区变大的过程中,resize事件会被触发多次...每次触发都去请求一次的话没有必要...这时就需要节流防抖来做控制

    function resize(e) {
        console.log("窗口大小改变了");
    }
    window.addEventListener('resize', resize);
    
    resize.gif

    手写节流功能

    1. 使用时间戳
    function throttle(func, delay) {
        var last = 0;
        return function () {
            var now = Date.now();
            if (now >= delay + last) {
                func.apply(this, arguments);
                last = now;
            } else {
                console.log("距离上次调用的时间差不满足要求哦");
            }
        }
    }
    function resize(e) {
        console.log("窗口大小改变了");
    }
    window.addEventListener('resize', throttle(resize, 500));
    
    节流执行.gif
    1. 使用定时器
    function throttle(func, delay) {
        var timer = null;
        return function () {
            if (!timer) {
                func.apply(this, arguments);
                timer = setTimeout(() => {
                    timer = null;
                }, delay);
            } else {
                console.log("上一个定时器尚未完成");
            }
        }
    }
    function resize(e) {
        console.log("窗口大小改变了");
    }
    window.addEventListener('resize', throttle(resize, 500));
    

    以上可以看出,节流的意思就是函数在一段时间内的多次调用,仅第一次有效,只执行这段时间内的第一次的操作

    节流.gif

    防抖

    function debounce(func, delay) {
        var timeout;
        return function() {
            clearTimeout(timeout);
            timeout = setTimeout(()=>{
                func.apply(this, arguments);
            }, delay);
        }
    }
    function resize(e) {
        console.log("窗口大小改变了");
    }
    window.addEventListener('resize', debounce(resize, 500));
    
    防抖执行.png

    由以上可以看出执行resize函数与最后一次调用之间相差500ms。
    防抖就是在该段时间内多次调用函数,会重写改函数执行的延时器,一直多次调用则实际的resize函数一直不执行,直到该函数触发执行后500ms内没有再次触发后才会执行。
    所以防抖就像是PK赛里的待定区,下一个待定的人会把上一个待定的人踢出局

    debounce.gif

    相关文章

      网友评论

          本文标题:防抖debounce和节流throttle区别及手写实现

          本文链接:https://www.haomeiwen.com/subject/iereiltx.html