今天踩了一個基礎坑

程式設計三昧發表於2022-02-14

基礎坑.001

引言

不知道大家有沒有這樣一種經歷:突然發現自己之前很長時間都根深蒂固的一個觀點是錯誤的?

我今天就踩了一個坑:我的印象中一直以來記得 setInterval 在定義好之後會立即執行一次裡面的邏輯,所以在實現下圖的邏輯時,我將第二步(”立即執行邏輯 a“)給省去了,這一省卻給我帶來了了一個bug,汗~

image-20220214172213494

出了 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 協議》,轉載必須註明作者和本文連結

相關文章