防抖和节流都是前端常用的优化技术,它们可以对用户频繁触发某个事件造成的性能问题进行有效的解决,但是它们的实现方式有所不同,具体表现在以下几个方面:
1. 事件执行时机。
防抖:在一定时间(如200ms)内,如果持续触发事件,则只执行最后一次事件。
节流:每隔一定时间(如200ms)执行一次事件,忽略持续触发事件。
2. 实现原理。
防抖:在事件被触发n秒后执行回调函数,如果在这n秒内再次被触发,则重新计时。
节流:每隔n秒执行一次事件,并且在时间间隔内只会执行一次事件。
3. 应用场景。
防抖:适用于输入框的实时查询、窗口resize和scroll、拖拽等一些需要通过频繁触发事件来改变状态的场景。
节流:适用于图片懒加载、无限滚动、下拉刷新等需要间隔时间来执行函数的场景。
4. 代码实现。
防抖:
```javascript
function debounce(fn, delay) {
let timer = null;
return function() {
const args = arguments;
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
}
}
element.addEventListener('input', debounce(handleInput, 500));
```
节流:
```javascript
function throttle(fn, delay) {
let lastTime = 0;
return function() {
const nowTime = +new Date();
if (nowTime - lastTime > delay) {
fn.apply(this, arguments);
lastTime = nowTime;
}
}
}
element.addEventListener('scroll', throttle(handleScroll, 500));
```
综上所述,防抖和节流虽然都是优化事件处理的方法,但在具体实现上还是有很大区别的,需要根据具体场景选择适合的方式。