防抖和节流的编写和使用以及怎么传参

447 阅读1分钟

1.防抖函数

function fangdou(fn, time) {
    let timeout = null
    return function () {
        if (timeout!== null) {
            clearTimeout(timeout)
        }
        timeout = setTimeout(fn, time)
    }
}

2.节流函数

function jieliu(fn, time) {
    let isWork = false //是否开始工作
    return function () {
        if (isWork) {
            return false
        }
        isWork = true
        setTimeout(() => {
            fn()
            isWork = false
        }, time)
    }
}

3.使用

  • 一开始我是这样用的,但是是错误的

  •  因为防抖函数,返回的是一个回调函数,return了一个function,所以频繁点击,其实是频繁返回了一个回调 函数,然后多次执行了这个函数,就会出现点击了多少次,就打印了多少次的结果,比如我点击了6次,期望结果是只执行最后的一次,结果执行了6次

  •  正确的用法是

  • 咱们不能频繁返回函数,而是频繁调用这个返回函数,提前将这个返回函数存起来,然后频繁调用这个返回函数,节流同理

4.防抖和节流中怎么传参

  • 先了解一下定时器怎么传参数

    回调函数的参数可以通过定时器的后面的参数直接传递,多个参数用“,”拼接。
    setTimeout(setTime, 1000, 12, '路西')   // setTimeout(setTime, 1000, '参数1', '参数2’, ...) 
    function setTime(num, name) {
      console.log('定时器执行并且接收参数:', num, name)
    }
    
  • 因为防抖和节流是返回了一个函数,所以如果我们要传参,是在这里面传参