方法
对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);
}
}