节流函数和防抖函数在平常的开发中仍是有不少地方用到,两个函数的目的都是为了控制函数被调用的频率,今天咱们就来讲一说着两个函数。markdown
input触发键盘输入事件,将输入内容发送到后台:app
// 定义一个请求函数
function request(val) {
console.log("request: " + val);
}
let inputEl = document.getElementById("input");
inputEl.addEventListener("keyup", function (e) {
request(e.target.value);
});
复制代码
能够看到,咱们每次按下键盘输入的时候,都会去请求,这样很浪费资源,通常应用中都是等待用户输入完整的字符,再去请求后台,因此咱们用防抖函数来优化这一个。函数
事件被触发时,在n秒后执行函数,在n秒内屡次触发事件,则从新开始计时优化
利用定时器来实现,在n秒内屡次触发,则先清除定时器,重新计时this
// 定义一个请求函数
function request(val) {
console.log("request: " + val);
}
// 定义一个防抖函数
function debounce(fn, delay) {
let timeout;
return function(){
clearTimeout(timeout)
timeout = setTimeout(()=>{
fn.apply(this, arguments)
},delay)
}
}
let inputEl = document.getElementById("input");
let debounceInput = debounce(request, 500)
inputEl.addEventListener("keyup", function (e) {
debounceInput(e.target.value);
});
复制代码
只有当输入完成后才会触发函数,防止在不停是输入时调用函数,减小资源的浪费。spa
在规定的单位时间段内,函数只能执行一次,在单位时间内多少触发,则只有一次有效3d
当一个定时器执行,就会生成一个定时器id,当这个id存在就说明在单位时间内函数只执行了一次。code
// 定义一个请求函数
function request(val) {
console.log("request: " + val);
}
// 定义一个节流函数
function throttle(fn, delay) {
let timer;
return function(){
if(!timer) {
fn.apply(this, arguments)
timer = setTimeout(()=>{
clearTimeout(timer)
timer = null
},delay)
}
}
}
let inputEl = document.getElementById("input");
let throttleInput = throttle(request, 500)
inputEl.addEventListener("keyup", function (e) {
throttleInput(e.target.value);
});
复制代码
能够看到,当咱们在输入框中不断输入,请求函数在咱们规定的单位时间执行一次函数orm