''

  • 防抖应用场景

    非立即执行版

    /**
     * @description
     * @param {*} func 触发的时间
     * @param {*} wait 多少时长才执行事件
     * @return {*}
     */

            function debounce(func, wait{
                let timeout;
                return function(){
                    // 获取当前作用域和参数
                    const context = this;
                    const args = [...arguments] 
                    // 如果当前timeout 存在
                    // 清空定时器,再次等待wait时间过后再次执行事件
                    if(timeout) clearTimeout(timeout)
                    // 定时执行 传递进来的事件
                    timeout = setTimeout(()=>{
                        func.apply(context,args)
                    },wait)  
                }
            }

    立即执行版本

    function debounce(func,wait{
      let timeout;
      return function ({
          const context = this;
          const args = [...arguments];
          if (timeout) clearTimeout(timeout);
          const callNow = !timeout;
          timeout = setTimeout(() => {
              timeout = null;
          }, wait)
          if (callNow) func.apply(context, args)
      }
    }

    合成版本 防抖

    /**
     * @desc 函数防抖
     * @param func 函数
     * @param wait 延迟执行毫秒数
     * @param immediate true 表立即执行,false 表非立即执行
     */

    function debounce(func, wait, immediate{
      let timeout;
      return function ({
        const context = this;
        const args = [...arguments];
        if (timeout) clearTimeout(timeout);
        if (immediate) {
          const callNow = !timeout;
          timeout = setTimeout(() => {
            timeout = null;
          }, wait)
          if (callNow) func.apply(context, args)
        }
        else {
          timeout = setTimeout(() => {
            func.apply(context, args)
          }, wait);
        }
      }
    }

    2节流

    节流应用场景

    时间戳版本

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

    定时器版本

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

        }
    }

    3总结

    参考

    https://github.com/mqyqingfeng/Blog/issues/26



    浅聊防抖与节流 实现与应用-LMLPHP

    React Hook |    9  

    Vue

    Vue  8 

    MYSQL

    TypeScript(PDF+)



    浅聊防抖与节流 实现与应用-LMLPHP





    本文分享自微信公众号 - 前端自学社区(gh_ce69e7dba7b5)。
    如有侵权,请联系 support@oschina.cn 删除。
    本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

    04-06 22:25