防抖

个人理解:高频率的触发事件,等待最后一次事件触发后的间隔一定时间无再次触发才会执行

应用场景:例如在Input的输入框的搜索引擎,由于每次的输入都有相关信息的联动查询效果,然而如果每次的输入都触发显然是对服务器压力会很大,并且前端也会高频率的响应,这个是会很浪费资源的,所以可以用函数的防抖来对其自动关联的模糊查询进行一定的限制

具体代码(低配版普通):

//封装防抖函数
function debounce(fn, delay = 200) {
  let timeout;
  return function () {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
}

...
//Vue中的使用
methods:{
    submitForm:debounce(function(){...})
}

具体代码(高配juyou立即执行选项):

function debounce(fn, delay, immediate = false) {
            let timeout = null
            return function () {
                clearTimeout(timeout)
                if (immediate) {
                    // 需求立即执行
                    let playNow = !timeout
                    timeout = setTimeout(() => {
                        timeout = null
                    }, delay);
                    if(playNow)fn.apply(this,arguments)
                } else {
                    // 正常延迟执行
                    timeout = setTimeout(() => {
                        fn.apply(this, arguments)
                    }, delay)
                }
            }
        }

节流

个人理解:在一定时间内高频率触发事件时,每隔一段时间自动执行一次

应用场景:例如scroll鼠标滚轮事件,mousemove鼠标滑动等..

具体代码(低配版普通):

let symbol = true

window.onscroll = function(){
	if(symbol){
    	console.log('节流')
    	setTimeout(()=>{
        	symbol = true
        },2500)
    }
    symbol = false
}

这个粗眼看去,和上面防抖的立即执行里的判断有点像,但是实则不然,防抖里的立即执行是重复点击会清空前面的延时器,非要等一锤定音了才会执行,而这个节流则是,一旦点了,那么就会触发,只不过是这个时间段不管你点几次它都只执行一次而已