從javascript應用的角度來說這叫函數防抖,其實從廣義的角度來說這屬於軟件防抖。防抖操作其實是基於業務操作來設計的,其實是一個很簡單的東西,卻很實用是真的。
防抖的業務場景是什麼?
用戶短時間內多次提交表單的操作
網絡原因,重複按提交按鈕
判斷scroll是否滑到底部等
爲什麼要防抖?
就是防止用戶短時間內做一些重複無效的操作,從而造成性能上不必要的負擔
我們來看業務場景,現在有一個提交按鈕,提交表單就將信息發送給服務器
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button type="button" onclick="fuck()" >這是一個按鈕</button>
<script>
function send(){
console.log('I have a message to server')
}
function fuck(){
send()
}
</script>
</body>
</html>
現在我們點擊一個按鈕就有一個‘I have a message to server’,如果此時用戶網絡不好沒有及時跳轉頁面,就會重複提交多次一樣的信息,這是重複而多餘的信息。
現在我們可以這樣設置:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button type="button" onclick="fuck()" >這是一個按鈕</button>
<script>
let handler = {
time:null,
send:function(){
console.log('I have a message to server')
},
do:function(){
//清除處理好的time,阻止之前的調用被執行
clearTimeout(this.time)
let self = this
this.time = setTimeout(function(){
self.send()
},3000)
}
}
function fuck(){
handler.do()
}
</script>
</body>
</html>
爲了效果明顯我延遲了三秒,就是你在三秒內如何多次提交表單其實只會提交一次
這就是函數防抖的業務場景的應用了。其實不管我們這麼設計函數,我們的目的是用戶短時間內做一些重複無效的操作,從而造成性能上不必要的負擔。掌握這一點如何設計函數隨意發揮了
衍生到廣義的軟件防抖:
本人是做嵌入式出身的,其實在嵌入式領域也有防抖一說,這些是業務上的一些操作都是通用的。
切換到嵌入式開發的環境:
現在是一個電路板子,需要控制一個燈的亮滅。 其實就是把一個電平拉高拉低的操作。通常情況下我們是這樣做的:
void debounce(int btn){
if(btn == 0)
{
sleep(100)
if(btn == 0)
{
PIN_9 = 0
}
}
}
這是一個僞代碼,大致的意思是,當檢測到btn輸入信號爲拉低電平時,第一次確實btn是否爲0,確定後在延遲100毫秒,是爲了防抖(是否爲誤操作,或者按開關),然後才使管腳9拉低置0(此時可能是亮燈或者滅燈,要看看是否有反向輸出的操作)
其實不管是JS WEB上的防抖,還是嵌入式C語言上做的防抖,都屬於軟件防抖,硬件上也有防抖的操作,用了幾個電容做了邏輯電路(如果沒記錯的話)
從硬件到軟件上的來看,說明防抖操作是一脈相承的,很多的業務上也會做。雖然簡單,但是設計思想是一脈相承的