场景需求:有些事件监听触发的次数太过频繁,比如scroll、resize等事件,一秒内可触发数十上百次,实际上如此频繁的事件触发是没有必要的,因为对用户来说一秒内可能100次与5次没有任何感官上的差别,因此需要对时间节流,限制事件触发的次数,能够在一定程度上优化页面,尤其是在事件中触发DOM更新的操作
话不多说上代码
//节流函数
function throttle(callback, waitTime) {
let timer = null;
//如果存在定时器表示当前有任务
//因此不再执行其他操作
return () => {
if (timer) {
return false;
}else {
timer = setTimeout(() => {
clearTimeout(timer);
timer = null;
callback();
},waitTime || 500)
}
}
}
//实际要执行的事件函数
function scrol() {
console.log('scrolling');
}
//添加事件
window.onscroll = throttle(scrol, 400);
由以上可以看出通过闭包返回一个函数执行体,当前有事件执行时便不再触发新的事件操作,由此可以大大降低事件触发的频率