防抖
- 概念
- 在事件触发n秒后才执行,如果期间频繁触发这个事件则
重新计时,直接n秒后才执行
- 例子
- 比如输入框请求,在用户输入停止后1秒才请求,如果用户一直在输入,则不请求,当用户输入停止之后1秒才开始请求
- 原理
- 通过
定时器来实现
- 当函数调用时,清除之前定时器,然后重新设置一个新的定时器
- 只有在定时器到期时,函数才会被执行
- 适用于
function debounce(func, delay) {
let timer = null
return function () {
timer && clearTimeout(timer)
timer = setTimeout(() => {
func(...arguments)
}, delay)
}
}
function search(a, b) {
console.log(`search${a} and ${b}`)
}
const de = debounce(search, 1500)
de(1, 2)
de(1, 2)
de(2, 3)
节流
- 概念
- 在
固定的间隔时间内,函数只能回被调用一次,间隔内调用不会重新计时
- 例子
提交按钮,避免连续点击
- 原理
- 记录上次函数执行的时间,每次调用函数时,判断当前时间与上一次执行时间的间隔是否大于设定值
- 如果在间隔内 小于设定值,则不执行函数
- 适用于
需要限制函数执行频率的场景,在规定时间间隔内只能执行一次操作
function throttle (func, delay) {
let isAwait = false
return function() {
if (isAwait) return
func(...arguments)
isAwait = true
setTimeout(() => isAwait = false, delay)
}
}
function search(a, b) {
console.log(`search${a} and ${b}`)
}
const th = throttle(search, 3000)
th(1 ,4)