引言
不知道大家有沒有這樣一種經歷:突然發現自己之前很長時間都根深蒂固的一個觀點是錯誤的?
我今天就踩了一個坑:我的印象中一直以來記得 setInterval 在定義好之後會立即執行一次裡面的邏輯,所以在實現下圖的邏輯時,我將第二步(”立即執行邏輯 a“)給省去了,這一省卻給我帶來了了一個bug,汗~
出了 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);
雖然邏輯和上面是一樣的,但不知為啥感覺這麼寫就是有點高大上呢,^-^
結束語
其實我自己到現在還沒理解自己為什麼會有那麼一個錯誤的記憶,並且這麼長時間以來都沒有發現修正。
犯錯誤不可怕,可怕的是沒意識自己犯了錯!
打鐵還需自身硬,別看別人的實現方式有多高大上,其實都是基礎知識的一些合理組合使用的結果而已,只要你基礎夠好,那即使面對一段簡簡單單的程式碼也能玩出不一樣的花樣!
~
~ 本文完,感謝閱讀!
~
學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!
本作品採用《CC 協議》,轉載必須註明作者和本文連結