性能优化
函数防抖(debounce)
为函数的执行设置一个定时器,在指定时间后才执行。如果在执行前又调用了函数,则会清除上个函数的定时器,以此次调用的函数的定时器,重新开始等待执行时间。
也就是说,多次连续调用一个函数,只会执行最后的一次调用。
function debounce(func, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => func(...args), delay);
};
}
值得注意的是,clearTimeout 接受 undefined 或 null 时,会静默失败,所以可以省略判断 timer 是否存在的条件判断。且在一次完整调用后,无需清除 timer。
用途
用于 UI 交互以及 API 调用的函数,防止多次连续的重复响应。
参考链接
函数节流(throttle)
让函数以一个固定时间间隔被调用。在时间间隔内的调用都会被忽略,直到一个时间间隔结束,函数调用才会成功。
function throttle(func, delay) {
let prev = null;
return function (...args) {
let now = Date.now();
if (now - prev > delay||!prev) {
func(...args);
prev = now;
}
};
}
如果第一次也需要间隔 delay 调用,可将 prev 赋值为 Date.now() 并去掉 if 后面的判断条件。
用途
参考链接