节流和防抖
题目
节流和防抖有何区别?分别用于什么场景?
防抖
防抖,即防止抖动。抖动着就先不管它,等啥时候静止了,再做操作。
例如,一个搜索输入框,等输入停止之后,自动执行搜索。
节流
节流,即节省交互沟通。流,可理解为交流,不一定会产生网络流量。
例如,drag 的回调,上传进度的回调,都可以设置一个固定的频率,没必要那么频繁。
答案
防抖:
//定义:触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。
//搜索框搜索输入。只需用户最后一次输入完,再发送请求
//手机号、邮箱验证输入检测 onchange oninput事件
//窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
const debounce = (fn, wait, immediate) => {
let timer = null;
return function (...args) {
if (timer) clearTimeout(timer);
if (immediate && !timer) {
fn.call(this, args);
}
timer = setTimeout(() => {
fn.call(this, args);
}, wait);
};
};
const betterFn = debounce(() => console.log("fn 防抖执行了"), 1000, true);
document.addEventListener("scroll", betterFn);
节流:
//定义:当持续触发事件时,保证隔间时间触发一次事件。
//1. 懒加载、滚动加载、加载更多或监听滚动条位置;
//2. 百度搜索框,搜索联想功能;
//3. 防止高频点击提交,防止表单重复提交;
function throttle(fn,wait){
let pre = 0;
return function(...args){
let now = Date.now();
if( now - pre >= wait){
fn.apply(this,args);
pre = now;
}
}
}
function handle(){
console.log(Math.random());
}
window.addEventListener("mousemove",throttle(handle,1000));
触发频率
- 防抖,不固定
- 节流,固定
场景
- 防抖,结果式,即一次调用即可
- 节流,过程式,即需要持续一个过程,一次不够
划重点
- 抓住“触发频率”是否固定,即可抓住重点
- 实际项目推荐使用 lodash