JS-节流、防抖

359 阅读1分钟

方法

对setTimeout()延时器的熟练使用,就可以解决这些问题。

节流

隔一段时间才触发一次(用于监听窗口滚动事件)(每隔1秒钟判断一次,是否执行取决于动作在给定间隔中是否命中)

function test(){
	console.log('123')
};
function throttle(fn,time){
	let action = false;
	if(action) return;
	action = true;
	fn.apply(this,arguments);
	setTimeout(function (){
		action = false;
	},time)
};
throttle(test,500);

防抖

多个动作合并成一次 (用于 input change 触发 ajax 异步事件,调整浏览器可视区域大小)(判断这一次与上一次长时间间隔是否大于某个固定值,才执行)

    // 防抖函数封装,fn表示要执行的具体业务代码函数体
    function debounce(fn, delay) {
      // 首先定义一个空的定时器
      let timer;
      return function() {
        // 定时器如果存在,即用户在n秒内触发了,违反规则,就取消这个定时器,然后在下面的代码中重置定时器,再计时n秒
        if (timer) {
          clearTimeout(timer)
        }
        // 取消定时器后,重新定时,重新计算时间,直到用户停止,达到delay的等待时间,才会触发业务函数执行
        timer = setTimeout(function() {
          fn.apply(this)
        }, delay);
      }
    }

参见

1.圆桌对话-lemos