防抖和节流
防抖
触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间
思路:
每次触发事件时都取消之前的延时调用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function debounce(fn) { let timeout = null; return function () { clearTimeout(timeout); timeout = setTimeout(() => { fn.apply(this, arguments); }, 500); }; } function sayHi() { console.log("防抖成功"); }
var inp = document.getElementById("inp"); inp.addEventListener("input", debounce(sayHi));
|
节流
高频事件触发,但在 n 秒内只会执行一次,所以节流会稀释函数的执行频率
思路:
每次触发事件时都判断当前是否有等待执行的延时函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function throttle(fn) { let canRun = true; return function () { if (!canRun) return; canRun = false; setTimeout(() => { fn.apply(this, arguments); canRun = true; }, 500); }; } function sayHi(e) { console.log(e.target.innerWidth, e.target.innerHeight); } window.addEventListener("resize", throttle(sayHi));
|