防抖函数
当触发事件一定时间内没有被触发,事件处理函数才会执行一次,如果设定事件到来之前又触发,将会重新延迟
触发事件 一段时间内 没有触发 事件执行 肯定是定时器(在设定的时间内 又一次触发了事件 重新开始延时 代表的就是重新开始定时器)(那么意味着上一次还没有结束的定时器要清除掉 重新开始)
实际应用
使用echarts时,改变浏览器宽度的时候,希望重新渲染
echarts的图像,可以使用此函数,提升性能。(虽然echarts里有自带的resize函数)典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时。
解决搜索的bug
function debounce(callback, delay) {
let timer
return function(arg) {
clearTimeout(timer)
timer = setTimeout(() => {
callback(arg)
}, delay)
}
}
function fn(value) {
console.log(value);
}
节流函数
当持续触发事件的时候 保证一段时间内 只调用一次事件处理函数
一段时间内 只做一件事情
实际应用 表单的提交
典型的案例就是鼠标不断点击触发,规定在n秒内多次点击只有一次生效。
let btn = document.querySelector('button')
let throttleFun = throttle(fn, 2000)
btn.onclick = function() {
throttleFun()
}
function throttle(callback, wait) {
let timer
return function() {
if(!timer) {
timer = setTimeout(() => {
callback()
timer = null
}, wait)
}
}
}
function fn() {
console.log(Math.random());
}
防抖和节流都是闭包的实际应用