陆阿黎
文章19
标签9
分类3
函数防抖和函数节流

函数防抖和函数节流

概念解释

函数节流和函数防抖,两者都是优化高频率执行 js 代码的一种手段。

在一定时间内,代码执行的次数不一定要非常多,达到一定的频率就足够了。有些情况下,代码运行频率达到一定程度时,超过那个频率所带来的效果是一样的,还不如把js代码执行的次数控制在一个合理的范围之内。既能够节省浏览器CPU的资源,又能够让页面浏览起来更加的顺畅,不会因为js的执行而发生卡顿。这就是我们要将的函数节流和函数防抖要做的事情。

函数防抖是指在频繁触发的情况下,只有再有足够的空闲时间时,才执行一代码一次。比如生活中做公交车,在一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有没人刷卡了,司机才会开车。
函数节流是指在一定时间内 js 只会执行一次。比如人眨眼睛,就是一定时间内眨一次。

示例

防抖

// 简单示例
window.addEventListener('resize',function(e){
    var t;
    return function(){
        if(t) clearTimeout(t);
        t = setTimeout(function(){
            // do something...
        },500);
    }
}());

节流

// 简单的节流函数
function throttle(func, wait, mustRun) {
    var timeout,
        startTime = new Date();

    return function() {
        var context = this,
            args = arguments,
            curTime = new Date();

        clearTimeout(timeout);
        // 如果达到了规定的触发时间间隔,触发 handler
        if(curTime - startTime >= mustRun){
            func.apply(context,args);
            startTime = curTime;
        // 没达到触发间隔,重新设定定时器
        }else{
            timeout = setTimeout(func, wait);
        }
    };
};
// 实际想绑定在 scroll 事件上的 handler
function realFunc(){
    console.log("Success");
}
// 采用了节流函数
window.addEventListener('scroll',throttle(realFunc,500,1000));