手写防抖、节流,防抖和节流的区别 ?
参考答案:
防抖和节流是两种常用的编程技术,用于优化高频率执行代码,减少调用的频率,从而提高性能。
防抖(Debounce)的原理是在事件被触发n秒后再执行回调函数,如果在这n秒内又被触发,那么会重新计时。这意味着,在连续触发事件的情况下,只有最后一次触发的事件会执行回调函数,前面的触发都会被忽略。防抖通常用于输入框等需要判断用户输入完毕后再执行的操作,例如手机号、邮箱等输入框的验证。
节流(Throttle)的原理是在一段时间内只执行一次事件回调函数,如果在这段时间内事件又被触发了,则忽略该事件。这意味着,在连续触发事件的情况下,会保证在规定时间内一定会执行一次回调函数。节流通常用于需要限制执行频率的场景,例如搜索联想功能,避免用户频繁输入导致请求过多。
手写防抖和节流的示例代码如下:
防抖(Debounce):
function debounce(fn, delay) {
let timer = null;
return function() {
let context = this;
let args = arguments;
if (timer) {
clearTimeout(timer);
timer = null;
}
timer = setTimeout(function() {
fn.apply(context, args);
}, delay);
};
}
节流(Throttle):
function throttle(fn, delay) {
let lastTime = 0;
return function() {
let nowTime = Date.now();
if (nowTime - lastTime > delay) {
lastTime = nowTime;
fn.apply(this, arguments);
}
};
}
这两种技术的主要区别在于,防抖会忽略所有除了最后一次触发的事件,而节流则会保证在规定时间内一定会执行一次回调函数。因此,它们适用于不同的场景,需要根据具体需求进行选择。