要是实在不知道要干什么,那就喝两杯思路就来了!

导航菜单

关于函数的防抖和节流

之前对防抖、节流这两个概念一直很混淆,实际上已在很多场景使用,但并不清楚这样做的目标是什么,好在哪里?突然在一次讨论中被八股文了,才意识到自己应该是时候关注一下了,于是就动手操刀一把,抓住真凶!因为知其然也要知其所以然嘛!

防抖:在指定时间内连续触发一个函数,结束后最终只执行一次。使用场景:改变浏览器窗口大小(onresize)或者滚动条位置(onscroll)触发事件。

<input id="antiShakeBtn" type="text" value="" placeholder="防抖测试">
// 防抖
function antiShakeHandle (callback, delay) {
    var timer = antiShakeHandle.timer;    
    var clearTimer = function () {
        clearInterval(timer);
        timer = undefined;
    };
    return function () {
        clearTimer();
        timer = setTimeout(function () {
            if (Object.prototype.toString.call(callback) === '[object Function]') callback();
        }, delay || 200);
    }
}

document.getElementById('antiShakeBtn').oninput = antiShakeHandle(function () {
    console.log('防抖成功');
}, 1000);


节流:持续触发一个函数,最终在每个时间周期内间隔执行一次,起到了稀疏频次的作用。使用场景:高频次点击搜索触发接口请求,以防止暴力点击行为。

<input id="throttleBtn" type="button" value="节流">
// 节流
function throttleHandle (callback, delay) {
    var timer = throttleHandle.timer;
    var clearTimer = function () {
        clearInterval(timer);
        timer = undefined;
    };
    return function () {
        if (timer) return;
        timer = setInterval(function () {
            if (Object.prototype.toString.call(callback) === '[object Function]') callback();
            clearTimer();
        }, delay || 200);
    }
}

document.getElementById('throttleBtn').onclick = throttleHandle(function () {
    console.log('节流成功');
}, 1000);


发表评论