最近有个朋友在面试过程当中遇到一个问题:什么是防抖
和节流
?糟了,这可触碰到个人知识盲区了,好像听也没听过这2个东西,痛定思痛,赶忙学习学习。javascript
在事件被触发n秒以后执行,若是在此期间再次触发事件,则从新开始计时。html
乍一看,这不是闲的蛋疼吗?为啥要等n秒以后再执行呢?vue
mpvue
+
vant-weapp
,
van-field
标签并无和数据进行双向绑定,而是每次都要触发
@input
事件,从而完成数据绑定:
咱们先本身想一下办法来解决这个问题。java
phoneNumber
上而后进行联想搜索,怎么算输入完成呢,输入一个数字到找到下一个数字输入大概须要1不到秒,只要用户一秒内没有再次输入,则将输入框内容与phoneNumber
绑定并进行联想搜索(什么?你说你输入五个字符就停下?不怕后台砍死你)debounce
、一个定时器、一个输入框、一个判断是否输入完成的函数getPhone
getPhone
,输入以后开启1秒定时器,若是在1秒内再次进行了输入,则清除以前的定时器,而且从新设置定时器;若是1秒内没有输入,则输入结束触发事件a
,进行联想搜索。<input id="phone" type="text"/>
复制代码
// 须要触发的函数
function debounce(d){
console.log("联想搜索phoneNumber:" + d)
}
let inp = document.querySelector("#phone");
// 输入触发的事件
function getPhone(fn,delay){
let timer;
// 使用闭包,保证每次使用的定时器是同一个
return (d)=>{
clearTimeout(timer);
timer = setTimeout(()=>{
fn(d);
// 结束以后清除定时器
clearTimeout(timer);
},delay)
}
}
let getPhoneDebounce = getPhone(debounce,1000);
inp.addEventListener('keyup',(e)=>{
getPhoneDebounce(e.target.value);
})
复制代码
这时候看输出:面试
若是持续触发一个事件,则在必定的时间内只执行一次事件。小程序
那么问题来了,既然是持续触发了,那为啥还要设定必定时间内只执行一次呢?废话,你吃鸡为啥不用AKM非要去追梦抢狗杂呢?还不是由于AKM射速慢(狗杂真香)!闭包
咱们来试着作一个AKM的设计模拟:app
shot
, 一个判断射击间隔是否结束的函数nextShot
,一个触发射击的按钮,判断射击是否结束的定时器timer
shot
,当继续点击的时候,射击无效,只有过了定时器设置的时间才能够继续射击。<button id="shot">射击</button>
复制代码
function shot(){
console.log('射击')
}
let btn = document.querySelector('#shot');
function nextShot(fn,delay){
let timer;
// 闭包原理同上
return ()=>{
// 定时器存在,没法射击
if(timer){
console.log('禁止射击');
}else{ // 定时器不存在,射击,并设置定时器
fn();
timer = setTimeout(()=>{
// 定时器结束,能够射击
clearTimeout(timer);
timer = null;
},delay)
}
}
}
let start = nextShot(shot,20);
btn.addEventListener('click',()=>{
start();
})
复制代码
当咱们疯狂点击按钮的时候:函数
可能这个例子不是很突出,我再说个相似的,英雄联盟和DNF的技能冷却应该更适合~工具
公司的大数据组件目前是只要页面大小发生变化就会从新加载,这就致使了有时候拉一下控制台会发生不少次请求,这个时候就能够用防抖
来解决一下了~