export function throttle(fn, delay) {
let lastTime = 0 // 上次执行的时间
return function (...args) {
let now = Date.now()
if (now - lastTime >= delay) {
fn.apply(this, args)
lastTime = now
}
}
}
// 定时器实现
export function throttle (fn, delay=500) {
let flag = true
const interval = delay
return function (...args) {
if (flag) {
// 每个函数都有apply方法,调用apply可以改变当前函数的this和参数
fn.apply(this, args)
// 修改传入的函数this指向以及传递参数
flag = false
setTimeout(() => {
flag = true
}, interval)
}
}
}
function handleThrottledScroll(event) {
console.log('滚动中...');
}
const throttledScroll = throttle(handleThrottledScroll, 2000);
window.addEventListener('scroll', throttledScroll);
export function debounce(fn, delay) {
let timerId = null // 定时器id
return function (...args) {
timerId && clearTimeout(timerId)
timerId = setTimeout(() => {
fn.apply(this, args)
timerId = null
}, delay)
}
}
function handleDebouncedInput(event) {
console.log('输入事件节流中...');
}
const debouncedInput = debounce(handleDebouncedInput, 2000);
document.getElementById('inputField').addEventListener('input', debouncedInput);
节流第一次执行函数,没有延迟直接执行,后面的都固定时间间隔执行一次;
防抖第一次执行函数,有延迟,延迟时间结束之后再执行;