函數防抖
函數防抖,這裡的抖動就是執行的意思,而一般的抖動都是持續的,多次的。
假設函數持續多次執行,我們希望讓它冷靜下來再執行。
也就是當持續觸發事件的時候,函數是完全不執行的,等最後一次觸發結束的一段時間之後,再去執行。
函數防抖的場景
• 登入、發短信等按鈕避免使用者點選太快,以緻于發送了多次請求,需要防抖
• 調整浏覽器視窗大小時,resize 次數過于頻繁,造成計算過多,此時需要一次到位,就用到了防抖
• 文本編輯器實時儲存,當無任何更改操作一秒後進行儲存
函數防抖的實作
function debounce(func,delay){
let time;
return function(){
clearTimeout(time);
time = setTimeout(()=>{
func.apply(this,arguments);
},delay)
}
}
box.onmousemove = debounce(function(e){
box.innerHTML = `${e.clientX},${e.clientY}`
},1000)
函數節流
節流的意思是讓函數有節制地執行,而不是毫無節制的觸發一次就執行一次。
什麼叫有節制呢?就是在一段時間内,隻執行一次。
函數節流的場景
• scroll 事件,每隔一秒計算一次位置資訊等
• 浏覽器播放事件,每個一秒計算一次進度資訊等
input 框實時搜尋并發送請求展示下拉清單,沒隔一秒發送一次請求 (也可做防抖)
函數節流的實作
<script type="text/javascript">
const box = document.getElementById("box");
function throttle(func,delay){
let run = true;
return function(){
if(!run){ //如果開關關了,直接退出
return;
}
run = false;//持續觸發的話,run一直是false,就會提供留在上面的判斷中
setTimeout(()=>{
func.apply(this,arguments);
run = true//定時器到時間之後,會把開關打開,我們的函數就會被執行
},delay)
}
}
box.onmousemove = throttle(function(e){
box.innerHTML = `${e.clientX},${e.clientY}`
},1000)
</script>