复习: 手写防抖和节流函数

防抖

定义

当持续触发事件,一定事件内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前 ,又一次触发了事件 ,就重新开始延时。

通俗曰:多次事件触发的时间间隔未超过规定的时间间隔,就永远不会触发该事件。

手写代码

<body>
    <input type="text">
</body>
<script>
    const debounce = function(func, delay) {
          
   
        let timer;
        return function(args) {
          
   
            clearInterval(timer)
            timer = setTimeout(function(){
          
   
                func(args)
            }, delay)
        }
    }
    const input = document.querySelector(input)
    const inputFunc = function(value) {
          
   
        console.log(`${
            
     value}`);
    }
    const inputDebounce = debounce(inputFunc, 1000)
    input.addEventListener(keyup,function(e) {
          
   
        inputDebounce(e.target.value)
    })
</script>

第一次延时触发后,在延时时间内,又一次触发事件,则将第一次的延时操作清除,重新将第二次的触发事件进行延时。

只有在一次延时操作内,没有再次的事件触发,这次的事件才能被完整触发。

应用

搜索框的联想建议,避免频发发送后台请求。

节流

定义

当持续触发事件的时候,保证一段时间内,只调用一次事件处理函数。

通俗曰:多次事件触发在一个延时时间单位内,只触发多次事件的第一个。

手写代码

<body>
    <button id="button">点击</button>
</body>
<script>
    function throttle(fun, delay) {
          
   
        let timerOut;
        return function() {
          
   
            if(!timerOut) {
          
   
                timerOut = setTimeout(function(){
          
   
                    fun()
                    timerOut = null
                }, delay)
            }
        }
    }
    const btn = document.querySelector(#button)
    function handle() {
          
   
        console.log(Math.random());
    }
    btn.onclick = throttle(handle, 1000)
    
</script>

在第一次的延时操作时间内,再次触发第二次操作,将不予理会,等到第一次延时时间完毕,第一次事件触发完成,这时再次触发才会有效。

应用

避免频繁提交表单。

区别

通俗曰:

防抖:多次事件触发的间隔时间不超过延时时间,就一直不会触发。

最后一次事件最终触发

节流:一次事件在延时时间内等待触发,其他的事件一直无法触发。

只触发延时操作内,第一个事件。

经验分享 程序员 微信小程序 职场和发展