為什麼有的高階程式設計師很討厭甚至禁止使用 setTimeout?

時間 2021-05-11 23:54:19

1樓:爛筆頭

對於JS來說,沒有什麼 BUG 是 setTimeout(0) 解決不了的,如果有,就改成 setTimeout(300)。對於 CSS 來說,沒有什麼布局問題是套乙個 div 解決不了的。如果有,那就再套乙個!

2樓:

突然想到乙個很沙雕的寫法

letnowTime

=new

Date

().getTime

();while

(true)}

3樓:小銘同學

首先這個觀點我是不認同的,合不合適還是看場景。setTimeout是在Event Loop裡很重要的timer,是相容性非常好的非同步方案了。

比如,Vue在$nextTick這個API的實現上,就用了setTimeout作為macrotask裡的兜底策略。

4樓:Itroad

setTimeout 是無辜的。而且,JS高程裡,明確提出,推薦使用 setTimeout ,少用 interval 。 不知你的高階程式設計師,有多高階。

5樓:Cyandev

別扯什麼 microtask,請告訴我怎麼不使用 setTimeout / setInterval 實現驗證碼倒計時功能。

注意哦,題目是禁止,不是濫用。

6樓:奇幻旅程

你這問題問錯了吧,高階程式設計師都很喜歡用setTimeout,很多人甚至用他代替setinterval. 只有萌新才討厭用,為啥呀,因為萌新管理不好邏輯, 亂用,濫用,瞎用setTimeout. 導致各種問題,比如動畫卡頓啊,狂佔系統資源啊什麼的....

你看看現在的回答,很多就是自己濫用setTimeout造成了各種問題,然後非要責怪別人setTimeout不好..

7樓:Ivony

抱歉我真想不出來JS裡面的setTimeout有替代品,這貨幾乎是無可替代的(setInterval本質上是乙個東西),不允許用有些東西就是做不了。

setTimout本質上就是乙個註冊乙個延時觸發的事件。並不是所有的狀態改變都可以註冊事件,有些場景不直接/間接使用setTimeout/setInterval就做不了。

當然,直接使用這種低階API的確是不值得倡導的,就像濫用Thread.Sleep一樣……

8樓:「已登出」

應該有很多應該用requestAnimationFrame的情況,就不應該用settimeout,具體地說比如,動畫,聲音什麼的。

還有乙個是,帶有延時的settimeout,執行結果是否依賴於延時,以及在有process.beforeExit可用的情況下,使用帶延時的settimeout的情況(前端不存在的)……好吧就算是有beforeExit,有延時的settimeout也是有用的,比如不嚴格依賴於延時的延時/定時任務,但是如果單純是等待的話,beforeExit更好………當然如果有其他方法可用的話還是不要用這個。

另外就是,如果有settimmedite和nexttick可用的情況,settimeout 0什麼情況下用的問題。

9樓:

那得看review的人自己提的什麼解決方案,如果是讓你用框架裡帶的timeout,那就很正常,因為框架裡的timeout會考慮相容性的情況下用更好的能達到這個目的的新函式,但是絕對禁止使用timeout這種形式是肯定有問題的

10樓:黃玄

setTimeout 多高階啊,MicroTask 搞不定的問題就要靠它了,人家的 Callback 可是 Task 呢。

當然現在還有更高階的 Double RAF,才總算有可以替代 setTimeout 的存在了,詳見 HTML 8.1.4.

2.7.3、8.

1.4.2.

7.3.7.

10 與 8.9

requestAnimationFrame(() => {requestAnimationFrame(() =>

11樓:雲天明

為啥?stmout類函式是目前我們調戲event loop最常用的手段啊……尤其是stmout(cb, 0)

有可能是因為你所實現的東西「不應該」去調戲event loop吧。

當然在我看來一切不是0的stmout都應該慎重考慮233。

12樓:掌握魔法的大神哥

因為這些所謂的「高階程式設計師」會裝比啊,他們會用自稱多年的經驗來打敗你這自己還模稜兩可的想法,最後不忘了懟你一句:我吃的鹽比你吃的公尺還多。

我估計在他們眼中,setTimeout曾經是他們的夢魘,當時可能多寫了導致混亂出現異常,好些天不曾解決,於是費盡心思祛除這些定時器,最後覺得自己騎著白馬打敗了搶公主的惡魔...於是乎在後人打算去喚醒這些「惡魔」的時候,老「王子」就站了出來並且義正言辭的批判他們...

13樓:木頭人

而且,一般上層應用來說,基於事件就好了,幹啥要使用這玩意,除非真的有延時操作。

再者,對於需要 e2e 測試的站點來說,setTimeout 最好用 setInterval 實現。

14樓:陳堅榮-百週CEO

主要是思考一下,當使用這個用法的時候,如果setTimeout 100次,有1次時間跟你設定進去的相差了5倍,有無什麼嚴重後果。

沒有的話,儘管用:)

15樓:邁chael

setTimeout可以用,但不要濫用,瞎用。原因上面很多答案都說的很清楚了。

至於題主接觸的程式設計師為什麼禁止使用setTimeout,可能是因為以前被別人寫的setTimeout坑過。

又不想花時間乙個個給setTimeout做分析,索性就禁止了。

你還不如乾脆直接問他來的快,原因太多了。

16樓:凱斯

如果有兩個非同步任務,而且需要規定它們的執行順序的時候

可以採用setTimeout(fn, 0)的方式將其中乙個非同步推入Event Loop中,這樣就能保證執行順序了

當然了,也可以是使用ES6新增的Promise物件

17樓:

如果你使用 setTimeout 第二個引數不是 0,那 90% 的概率是你錯了;如果是 0,那 90% 的概率他錯了。

18樓:汪志成

這是一種常見的技巧,沒見過誰全面禁止使用它的。

當然,如果發現問題不查原因就用它來碰運氣解決,那當然是不可取的。但不可取的原因不是setTimeout而是「不查原因」。

19樓:

不是不能用setTimeout,是不要在沒有知道原理的情況下濫用setTimeout。

打個簡單的比方:

querySelector某些元素,是需要在DOMContentLoaded 後才能進行的。但是有可能你不知道這個事件,你就直接用setTimeout去處理,你確實是解決了這個問題,但是這只能說是一種hack的方案,而不是最優額解決方案。

20樓:陳亮

setTimeout在多執行緒場景運用非常廣泛。如果執行緒a遲遲獲取不到鎖,timeout之後專做其他事情,避免了死鎖的出現。也提高資源利用率啊。

21樓:劉濤

剛開始對event loop不了解,有一些非同步的問題不知道怎麼解決。就知道setTimeout一下就好了。。現在想想,確實很low

不過很多情況下還是要用setTimeout的啊。比如延遲一段時間執行一些操作,比如自己寫個debounce,throttle。

22樓:Mark

如果是新手不熟悉非同步流程控制而使用 setTimeout 偽實現,這確實應該禁止。難護不說,更多的是在很多情況下邏輯都可能不太對(比如 ajax 返回時間長了點,這很常見)。

但是有些效果又是非 setTimeout 不可實現的,這種情況不應該禁止 setTimeout

23樓:默語

一般情況下setTimeout可以通過非同步和事件解決,但是有的時候涉及到玄學或者就是動畫效果的延遲不用setTimeout用什麼呢?!

24樓:程墨Morgan

你需要問對方:不用setTimeout的話應該用什麼?

當然,我不是說就該用setTimeout,也要看具體情況,但是反對的人要給出理由和替換方法。

很討厭程式設計師怎麼辦?

擱淺的魚 討厭的話那就離開唄 又沒人拿刀逼著你。我覺得程式設計師是最沒有那種勾心鬥角爾虞我詐的人了。不知道你是受了什麼刺激?他 她 對你做了什麼傷天害理的事嗎?說出你的故事 caryyu 以後每個人都將會是程式設計師,如果你不讓你的後代掌握程式設計師所掌握的知識,以後的社會很難找到工作的,智慧型與自...

PHP程式設計師為什麼被所有其他程式設計師鄙視

無缺草 最新統計,截至目前,PHP依然是 世界上最好的程式語言 Web 你可以放心去學了。十年之內不會落伍,二十年之內不會淘汰。郭德綱也被交大博士鄙視 趙雷 樹大招風,他們眼紅。眼紅而沒有辦法,php就是這麼強大,哈哈哈哈哈哈。幹不掉php吧,啦啦啦啦啦 啦啦啦啦。什麼多執行緒什麼高併發。什麼長時間...

10 24為什麼是程式設計師節,程式設計師當天有什麼節日活動嗎?

1024節本身就是乙個bug,這天我們都在忙著debug呢。程式猿的節日從來不會是什麼1024,甲方認同設計 專案經理不為難都能讓我們開心半天,你覺得一群熊貓眼的禿頭怪會喜歡乙個時刻提醒自己身份的節日? 麗晶軟體 今天是1024程式設計師日,祝願各位節日快樂!作為一家軟體公司,特意為程式設計師們準備...