zoukankan      html  css  js  c++  java
  • 函数的防抖与节流(debounce throttle)

    函数防抖和节流知识点总结(debounce,throttle)

    目的:

    函数的节流和防抖目的都在于减少函数的执行次数

    一、防抖的两个实现

    1. 没有提供triggleNow 参数,函数第一次不会做延迟执行的操作

      
       let btn = document.getElementById('btn')//这里上面我们假定已经指定了一个按钮用于触发的debounce函数的执行
              btn.addEventListener('click', debounce1(submit, 1000))
      
              function submit() {
                  console.log('我被点击了')
              }
      
      
       function debounce1(fn, time) {
                  let t = null
                  return function() {
                      if (t) {
                          clearTimeout(t)
                      }
                      t = setTimeout(() => {
                          // 这里的this  因为是在箭头函数中的,本身并没有this  找的是return 出去的函数的this  这个函数是btn 的点击事件触发执行的,所以this 为 button这个标签;同理的arguments也是这个函数中的arguments
                          
                          fn.apply(this, arguments)
                      }, time)
                  }
              }
      
    
    
    //2.有可以指定立即执行的版本 
            function debounce2(fn, time, triggleNow) {
                let t = null
                return function() {
                 // 如果t值不为null,则需要清除定时器   
                    if (t) {
                        clearTimeout(t)
                    }
    
                    if (triggleNow) {
                        // 如果t值为null 证明为第一次点击
                        let firstClick = !t  //取反为真
                        if (firstClick) {
                            // 立即执行
                            fn.apply(this, arguments)
                        }
                        t = setTimeout(() => {
                         // 在设定的时间内在此触发每次都会清除上一次的定时任务,使得回调函数一直没有执行,当定时任务时间到了就会把t设置为null ,这样再次触发会被再次认定为第一次点击
                            t = null
                        }, time)
                    } else {
                        //如果没有设置triggleNow(undefined,null),或者值为false,这version1版本一样
                        t = setTimeout(() => {
                            fn.apply(this, arguments)
                        }, time)
                    }
                }
            }
    

    二、节流(throttle)

    思想:

    流的思想在于,设置一个延迟的时间, 当前时间减去上一次触发函数的时间 大于 设置的延迟时间的值是才让函数执行

    实现:

    
          // 3.throttle节流
    function throttle(fn, delay) {
                let begin = 0
                return function() {
                    let currentTime = new Date().getTime()
                    if (currentTime - begin > delay) {
                        fn.apply(this, arguments)
                    }
                    begin = currentTime
                }
            }
    
  • 相关阅读:
    【POJ】【2420】A Star not a Tree?
    【BZOJ】【2818】Gcd
    【BZOJ】【2190】【SDOI2008】仪仗队
    【Vijos】【1164】曹冲养猪
    【BZOJ】【1430】小猴打架
    【BZOJ】【3611】【HEOI2014】大工程
    【转载】完全图的生成树
    【BZOJ】【2286】【SDOI2011】消耗战
    【POJ】【1061】/【BZOJ】【1477】青蛙的约会
    Codeforces VK Cup Finals #424 Div.1 A. Office Keys(DP)
  • 原文地址:https://www.cnblogs.com/comyan/p/13948155.html
Copyright © 2011-2022 走看看