节流
节流的核心思想: 如果在定时器的时间范围内再次触发,则不予理睬,等当前定时器完成
,才能启动下一个定时器任务。这就好比公交车,10 分钟一趟,10 分钟内有多少人在公交站等我不管,10 分钟一到我就要发车走人!
代码如下:
function throttle(fn, interval) {let flag = true;return function(...args) {let context = this;if (!flag) return;flag = false;setTimeout(() => {fn.apply(context, args);flag = true;}, interval);};
};
写成下面的方式也是表达一样的意思:
const throttle = function(fn, interval) {let last = 0;return function (...args) {let context = this;let now = +new Date();// 还没到时间if(now - last < interval) return;last = now;fn.apply(this, args)}
}
防抖
核心思想: 每次事件触发则删除原来的定时器,建立新的定时器。跟王者荣耀的回城功能类似,你反复触发回城功能,那么只认最后一次,从最后一次触发开始计时。
function debounce(fn, delay) {let timer = null;return function (...args) {let context = this;if(timer) clearTimeout(timer);timer = setTimeout(function() {fn.apply(context, args);}, delay);}
}
双剑合璧——加强版节流
现在我们可以把防抖
和节流
放到一起,为什么呢?因为防抖有时候触发的太频繁会导致一次响应都没有,我们希望到了固定的时间必须给用户一个响应,事实上很多前端库就是采取了这样的思路。
function throttle(fn, delay) {let last = 0, timer = null;return function (...args) {let context = this;let now = new Date();if(now - last < delay){clearTimeout(timer);setTimeout(function() {last = now;fn.apply(context, args);}, delay);} else {// 这个时候表示时间到了,必须给响应last = now;fn.apply(context, args);}}
}