防抖函数
当持续触发事件,一定时间内没有再触发时间,事件处理函数才会执行一次,如果设定的时间到来之前,又触发了事件,就重新开始延时。 触发事件,一段时间内,没有触发事件执行,肯定是定时器。 在设定的时间内,又一次触发了事件,重新开始延时,代表的就是重新开始定时器。 那么意味着上一次还没结束的定时器要清除掉,重新开始。
let timer
clearInterval(timer)
timer=setTimeout(function(){
},delay)
实际的应用: 使用echarts时,改变浏览器宽度的时候,希望重新渲染echarts的图像,可以使用此函数,提升性能。(虽然echarts里有自带的resize函数); 典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时,解决搜索的bug。
function debounce(delay){
let timer
return function(value){
clearTimeout(timer)
//我们想清除的是setTimeout 我们应该存储这个timer的变量
//timer变量需要一直存放在内存中;
//既然你不想打印之前已经输入的结果,清楚以前触发的定时器;
//我们应该存储这个timer的变量;
//一直要在内存当中,内存的泄露,闭包
timer=setTimeout(function(){
console.log(value)
},delay)
}
}
//我需要的是,首先,输入框的结果只出现一次,是在我键盘抬起不再输入后的1秒之后
var denounFun=debounce(1000)
input.addEventListener('keyup',function(e){
debounceFun(e.target.value)
})
|