关于节流和防抖

在前端开发中会遇到一些频繁的事件触发,比如:

  • window 的 resize、scroll
  • mousedown、mousemove
  • keyup、keydown
    这会导致绑定的函数频繁地执行。
    为了防止太过于频繁地执行绑定的函数,我们一般有两种解决方法:
  • 1、debounce 防抖
  • 2、throttle 节流

防抖

防抖的原理是:在事件触发n秒之后才执行函数,如果在n秒之内,又触发了这个事件,则以新的时间为准,n秒后再执行。总之,就是要触发事件n秒之内不再触发,才会执行。

function debounce(func, wait) {
    var timeout;
    return function () {
        var context = this;
        var args = arguments;
        clearTimeout(timeout)
        timeout = setTimeout(function(){
            func.apply(context, args)
        }, wait);
    }
}

节流

节流的原理:如果持续触发事件,每隔n秒执行一次事件。
有两种方式实现节流:1、时间戳;2、定时器
时间戳:

function throttle(func, wait) {
    var context, args;
    var previous = 0;

    return function() {
        var now = +new Date();
        context = this;
        args = arguments;
        if (now - previous > wait) {
            func.apply(context, args);
            previous = now;
        }
    }
}

定时器:

function throttle(func, wait) {
    var timeout;
    var previous = 0;

    return function() {
        context = this;
        args = arguments;
        if (!timeout) {
            timeout = setTimeout(function(){
                timeout = null;
                func.apply(context, args)
            }, wait)
        }

    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数节流 还记得上篇文章中说到的图片懒加载吗?我们在文章的最后实现了一个页面滚动时按需加载图片的方式,即在触发滚动...
    柏丘君阅读 7,929评论 1 19
  • 首先要明白 节流 Throttle 和 去抖动 Debounce 两者是有区别的,很多人一开始都会搞混。先讲讲去抖...
    圭宁_2ce3阅读 10,455评论 1 9
  • 函数节流场景 例如:实现一个原生的拖拽功能(如果不用H5 Drag和Drop API),我们就需要一路监听mous...
    凡凡的小web阅读 4,198评论 0 0
  • 前端菜鸟一只,查阅了一些资料,大概明白了什么是函数节流 是什么? 就是让一个函数无法在很短的时间间隔内连续执行,只...
    庄海鑫阅读 5,707评论 2 3
  • 章二:与子同裳[……岂曰无衣?与子同裳……] 一阵稣香袭鼻而来,相舞眉头紧蹙脸颊有着无血色的白,让人我见忧怜。眼...
    小丁壳猜可爱阅读 2,812评论 0 1

友情链接更多精彩内容