[圖片上傳失敗...(image-8910ac-1644833937519)]
引言
不知道大家有沒有這樣一種經歷:突然發現自己之前很長時間都根深蒂固的一個觀點是錯誤的?
我今天就踩了一個坑:我的印象中一直以來記得 setInterval 在定義好之后會立即執行一次里面的邏輯,所以在實現下圖的邏輯時,我將第二步(”立即執行邏輯 a“)給省去了,這一省卻給我帶來了了一個bug,汗~
[圖片上傳失敗...(image-902462-1644833937519)]
出了 bug,就要補救,態度不能丟!
青銅級
說到最簡單的修復方案,那就是我們經常會用到的方法,代碼如下:
function fun(){}
fun();
setInterval(fun, 1000);
對,就是這么簡單且樸實無華!
鉆石級
既然是鉆石級了,那就必須要玩出點花樣,否則那不就白瞎這段位了。
上面青銅級的實現其實存在一個隱患:不能確保同一時間只有一個執行這個邏輯的定時器。那么我們再來封裝一下:
let timer = null;
function func(){}
function mainFun(callback, time){
callback();
return setInterval(callback, time);
}
timer && clearInterval(timer);
timer = mainFun(func, 1000);
星耀級
使用目標函數返回目標函數自身。
let timer = null;
function func(){}
timer && clearInterval(timer);
timer = mainFun(func(), 1000);
嗯,代碼格調又高了一截。
王者級
既然是需要立即執行,那為何不用自執行函數呢?
let timer = null;
timer && clearInterval(timer)
timer = setInterval((function func () {})(), 1000);
雖然邏輯和上面是一樣的,但不知為啥感覺這么寫就是有點高大上呢,-
結束語
其實我自己到現在還沒理解自己為什么會有那么一個錯誤的記憶,并且這么長時間以來都沒有發現修正。
犯錯誤不可怕,可怕的是沒意識自己犯了錯!
打鐵還需自身硬,別看別人的實現方式有多高大上,其實都是基礎知識的一些合理組合使用的結果而已,只要你基礎夠好,那即使面對一段簡簡單單的代碼也能玩出不一樣的花樣!
~
~ 本文完,感謝閱讀!
~
學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!