防抖与节流最佳实现

36 阅读1分钟
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="button" value="btn" id="btn">
  <script>
    let btn = document.querySelector('#btn')
    btn.addEventListener('click', fu)
    function say() {
      console.log(123)
    }
    function fu() {
      process()
      fusion(say, 1000)()
    }

    let process = once(say)
    function fusion(fn, delay) {
      let preTime = Date.now()
      let timer = null
      if (timer) clearTimeout(timer)
      return args => {
        timer = setTimeout(() => {
          if (Date.now() - preTime < delay) return
          say.call(this, args)
          preTime = Date.now()
          timer = null
        }, delay)
      }
    }
    function once(fn) {
      let called = false
      return args => {
        if (called) return
        fn.apply(this, args)
        called = true
      }
    }
  </script>
</body>
</html>