防抖
触发事件之后,在n秒内函数只能执行一次,如果在n秒内又触发了函数,则会重新计算函数执行事件
/**
* @desc 函数防抖
* @param fn 函数
* @param wait 延迟执行毫秒数
* @param immediate true 表立即执行,false 表非立即执行
*/
const debounce = function (fn, wait, immediate = false) {
let timer = null
return function () {
let context = this
let args = arguments
if (timer) {
clearTimeout(timer)
}
if (immediate) {
// 立即执行版本
let callNow = !timer
if (callNow) {
fn.apply(context, args)
}
timer = setTimeout(() => {
timer = null
}, wait)
} else {
timer = setTimeout(() => {
fn.apply(context, args)
}, wait)
}
}
}
节流
连续触发事件但是在 n 秒中只执行一次函数。
/**
* @desc 函数节流
* @param fn 函数
* @param wait 延迟执行毫秒数
* @param type 1 表时间戳版,2 表定时器版
*/
const throttle = function (fn, wait, type) {
if (type === 1) {
let preTime = 0
return function () {
let context = this
let args = arguments
let nowTime = new Date()
if (nowTime - preTime > wait) {
preTime = nowTime
fn.apply(context, args)
}
}
} else {
let timer = null
return function () {
let context = this
let args = arguments
if (!timer) {
// 当延迟时间结束后,执行函数
timer = setTimeout(() => {
timer = null
fn.apply(context, args)
}, wait)
}
}
}
}