函数防抖和函数节流

  • 函数防抖:在任务频繁触发的情况下,只有任务触发的时间超过指定间隔的时候,任务才会执行。
  • 函数节流:在指定时间间隔内只会执行一次任务。

原理:巧妙地利用setTimeout来存放待执行的函数,这样可以很方便的利用clearTimeout在合适的时机来清除待执行的函数。
目的:节约计算机资源。

函数防抖(debounce)

  • 如果下达该命令后,在t毫秒内再次下达该命令,则取消刚刚下达的命令,只执行新命令
  • 最终效果: 对于连续动作(动作间的时间间隔小于t),以最后一次为准
function debounce(fn,wait){
    let timer = null
    return function(){
        if(timer){
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            fn.apply(this,arguments)
        },wait)
    }
}

let fn = function(){
    console.log('hello world')
}

fn = debounce(fn,1000)

document.body.onscroll = fn

函数节流(throttle)

  • 从上一次命令结束开始的一定时间范围t内,如果多次连续下达命令,则只执行当前时间段t内第一次命令。
  • 最终效果:对于连续动作,会过滤出部分动作,让这些过滤后的动作之间的执行间隔大于等于t
function throttle(fn, gapTime) {
    let lastTime = null
    let nowTime = null
    return function() {
        nowTime = Date.now()
        if(!lastTime || nowTime - lastTime > gapTime) {
            fn()
            lastTime = nowTime
        }
    }
}

let fn = () => console.log('我执行了')
fn = throttle(fn, 1000)

document.body.onscroll = fn

在滚动事件中引入函数节流是一个非常好的实践。以判断页面是否滚动到底部为例,当我们滚动滚动条的时候,浏览器会无时不刻地计算判断是否滚动到底部的逻辑,而在实际场景总是不需要这么做的,真实的应该是在滚动过程中,每隔一段时间再去计算这个判断逻辑。函数节流所做的工作就是每隔一段时间去执行一次原本需要无时不刻地在执行的函数
还有一个类似的场景便是编辑器的自动保存功能,编辑器内部应该设定了一个时间间隔来进行内容的保存,而不是时时刻刻,这样未免太耗资源。

可视化比较函数防抖和函数节流

函数防抖VS函数节流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概念 函数防抖(debounce) 当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执...
    yuanjiex阅读 645评论 0 1
  • 概述 函数防抖: 任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。 函数节流: 指定时间...
    番茄沙司a阅读 1,343评论 0 10
  • 前言 遇见的场景最近有频繁遇见的一个场景:在做搜索(包括数据量大做模糊搜索,后端实现)时,会遇见这种情况,在inp...
    夏知更阅读 308评论 0 1
  • 说到「函数防抖」和「函数节流」,两者其实概念比较相似。 1.「函数防抖」(debounce)通俗来说,就是把「多个...
    Jason_Shu阅读 656评论 0 0
  • 什么是函数防抖和函数节流 函数防抖(debounce):当事件被触发一段时间后再执行回调,如果在这段时间内事件又被...
    z_yyy阅读 892评论 0 3