防抖
当事件被触发时,设定一个周期延迟执行动作,若期间又被触发,则重新设定周期,直到周期结束,执行动作
function debounce(func, delay) { let timer = null; return function (...arguments) { clearTimeout(timer); //清除计时器 timer = setTimeout(() => { //重新记时 func.apply(this, arguments); }, delay); }; }
节流
在固定周期内,只执行一次动作,若有新事件触发,不执行,周期结束后,又有事件触发,开始新的周期
function throttle(func, delay) { let flag = true; //设置判断 return function (...arguments) { if (!flag) { //周期内直接返回 return; } flag = false; //周期开始 setTimeout(() => { func.apply(this, arguments); flag = true; //周期结束,判断允许 }, delay); }; }