导航
用户动作停止后,延迟 n 秒再执行事件处理函数
理解:
function debounce(fn, delay) {
let timer = null;
return function() {
if (timer) window.clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, arguments);
timer = null; // 当一个对象被赋值了 null 以后,原来的对象在内存中就处于游离状态,GC 会择机回收该对象并释放内存。因此,如果需要释放某个对象,就将变量设置为 null,即表示该对象已经被清空,目前无效状态。
}, delay);
}
}
如果希望事件触发时立即执行,可加个 triggerNow 参数:
function debounce(fn, delay, triggerNow = false) {
let timer = null;
let called = false; // 控制是否已经立即触发过
return function () {
const context = this;
const args = arguments;
if (triggerNow && !called) {
fn.apply(context, args);
called = true;
}
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
if (!triggerNow) {
fn.apply(context, args);
}
timer = null;
called = false; // 重置状态,下一轮调用可以再次立即触发
}, delay);
};
}
用户动作时, n 秒内只执行一次事件处理函数
理解:
function throttle(fn, delay) {
let canUse = true;
return function() {
if (canUse) {
fn.apply(this, arguments);
canUse = false;
setTimeout(() => canUse = true, delay);
}
}
}