节流和防抖
要想了解防抖和节流首先要先知道他的应用场景
这里就要首先引入一个感念 高频函数 例如 浏览器监听事件 的不间断执行
或者在用户疯狂点击一个按钮的时候 都可以看作是高频函数
什么是防抖
触发高频事件后 n 秒后 函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间
直接撸一个防抖
javascript
function debounce(fn, interval = 500) {
let timeout = null;
// 创建一个标记用来存放定时器的返回值
return function () {
clearTimeout(timeout);
// 每当用户输入的时候把前一个 setTimeout clear 掉
timeout = setTimeout(() => {
// 然后又创建一个新的 setTimeout, 这样就能保证输入字符后的interval
// 间隔内如果还有字符输入的话,就不会执行fn 函数
fn.apply(this, arguments);
}, interval);
};
}
// 假设这边有一个input 触发input事件会触发sayHi
function sayHi() {
console.log("防抖成功");
}
// 使用防抖函数可以减少他的触发次数
var inp = document.getElementById("inp");
inp.addEventListener("input", debounce(sayHi)); // 防抖
什么是节流
高频事件触发,但在 n 秒内 只会执 行一次,所以节流会稀释函数的执行频率.
直接撸一个节流
javascript
function throttle(fn, interval = 500) {
let canRun = true; // 通过闭包保存一个标记
return function () {
if (!canRun) return;
// 在函数开头判断标记是否为 true,不为 true 则return
canRun = false; // 立即设置为 false
setTimeout(() => {
// 将外部传入的函数的执行放在 setTimeout 中
fn.apply(this, arguments);
// 最后在 setTimeout 执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了.
// 当定时器没有执行的时候标记永远是false,在开头被 return 掉
canRun = true;
}, interval);
};
}
function sayHi(e) {
console.log(e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener("resize", throttle(sayHi));