节流与防抖
节流
throttle节流:减少请求资源,比如mouseove或resize事件会重复触发,使用throttle可以减少事件触发次数。实现原理是,在一段时间内只能完成固定次数请求,比如去火车站安检,一次只能过几个人,后边进行排队,避免前面发生拥挤。
// 事件戳方法
function throttle(callback, wait) {
let pre = Date.now();
return function () {
let now = Date.now();
if (now - pre >= wait) {
fn.apply(this, arguments);
pre = Date.now();
}
};
}
function handle() {
console.log(Math.random());
}
window.addEventListener("mouseover", throttle(handle, 1000))
// 定时器方法
function throttle(callback, wait) {
let timer = null;
return function () {
if (!timer) {
timer = setTimeout(function () {
callback.apply(this, arguments);
timer = null;
}, wait);
}
};
}
function handle() {
console.log(Math.random());
}
window.addEventListener("mouseover", throttle(handle, 1000));
防抖
debounce防抖:防抖是过了多久后才会执行的事件。 常见的input输入,根据输入数据发送接口请求【匹配相似关键词】。由于在输入过程中会有停顿,不确定什么时候输入完成,需要通过防抖机制,【输入词停顿300毫秒后表示输入完成,发送模糊接口请求】。 现实生活中的坐电梯时,电梯关门会一直等最后一个人进入停顿一段时间后才关门。
防抖分为非立即执行函数和立即执行函数
非立即执行函数:函数触发后不会立即执行,要等防抖设置的时间后才执行。等电梯的过程是非立即执行。
非立即执行版的意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
function debounce(callback, wait) {
let timeout = null;
return function () {
if (timeout) clearTimeout(timeout);
timeout = setTimeout(() => {
callback.apply(this, arguments);
}, wait);
};
}
function handle() {
console.log(Math.random());
}
window.addEventListener("mouseover", debounce(handle, 1000));
- 立即执行:先执行一次,输入框中有一个值时可以先立即执行下接口请求。触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数的效果。
function debounce(callback, wait){
let timeout = null;
return function(){
if(timeout) clearTimeout(timeout);
let runEvent = !timeout;
timeout = setTimeout(()=>{
timeout = null;
}, wait)
if(runEvent) callback.apply(this, arguments)
};
}
function handle() {
console.log(Math.random());
}
window.addEventListener("mouseover", debounce(handle, 1000));