防抖和节流

92 阅读1分钟

实现:

<input type="text">
const ipt = document.querySelector('input')

    // 什么叫防抖:一个高频事件在设定时间内只能执行一次,若再次执行则重新计算这段时间

    // 封装一个防抖函数
    function fangdouFn(fn) {
    
      // 定义延时器id
      let timeout = null
      return function () {
      
        // 当再次触发事件时立马中断上一次事件的执行,配合延时器就初步完成了防抖功能
        clearTimeout(timeout)
        
        // 定义一个延时器
        timeout = setTimeout(() => {
        
          // 此处this为绑定事件的对象,arguments为事件对象
          fn.apply(this, arguments)
          
        }, 500)
      }
    }

    function say(v) {
      console.log(v)
      console.log('防抖成功')
    }

    window.addEventListener('input', fangdouFn(say))
------------------------------------------------------------------------------------------

    // 封装一个节流函数
    // 概念: 一个高频事件在设定时间内只能执行一次,执行完毕后才会执行下一次
    function jieliuFn(fn) {
    
      // 定义一个初始条件,此次定义只会在事件绑定时执行一次
      let flag = true
      return function () {
      
        // 判断是否符合条件,如果不符合则中断执行
        if (!flag) return
        
        // 改变初始条件
        flag = false
        
        // 定义一个延时器,目的是让事件执行时中间有空隙
        setTimeout(() => {
          fn.apply(this, arguments)
          
          // 改回初始条件,表示此次事件执行完毕可以再次执行
          flag = true
          
        }, 500)
      }
    }

    function sayToo(v) {
      console.log(v.target)
      console.log('节流成功')
    }

    window.addEventListener('resize', jieliuFn(sayToo))