setTimeout(func,0)第二個引數為0分析
在很多實際專案中,會有如下類似程式碼:
[JavaScript] 純文字檢視 複製程式碼setTimeout(func,0)
看上去比較怪異,為何要等著0秒以後再去執行func函式,而不是直接呼叫。
可能不少初學者和當年本人一樣,甚至會生出這樣的想法,是不是專案人員在裝逼或者故弄玄虛。
出現上述想法,基本是因為對於如下兩個方法和概念沒有理解透徹:
(1).setTimeout()方法一章節。
(2).JavaScript非同步詳解一章節。
首先看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼for (var index = 1; index <= 3; index++) { setTimeout(function(){ console.log(index); },0); };
在直觀上,列印結果應該是1,2,3,但是實際列印結果是4,4,4。
結果分析如下:
即便第二個引數為0,setTimeout方法依然具有非同步功能,又由於JavaScript是單執行緒,所以setTimeout回撥函式只能在佇列中排隊,等待for迴圈執行完畢,這時index值已經變成4,所以列印結果都是4。
再來看一段例項程式碼加深與上述程式碼的理解:
[JavaScript] 純文字檢視 複製程式碼function onReady(fn) { var readyState = document.readyState; if (readyState ==="interactive" || readyState === "complete") { fn(); } else { window.addEventListener("DOMContentLoaded", fn); } } onReady(function () { console.log("DOM結構載入完畢"); }); console.log("開始輸出:");
上述程式碼本意要實現,當文件結構完全載入完畢再去執行onReady的回撥函式。
但是程式碼有一個問題,程式碼會根據DOM載入的狀態,輸出結果也會不同。
如果DOM結構未載入完畢,以非同步的方式執行fn,如果DOM結構已經載入完畢,以同步的方式執行fn。
載入完畢輸出順序:
(1)."DOM結構載入完畢"。
(2)."開始輸出"。
未載入完畢輸出順序:
(1)."開始輸出"。
(2)."DOM結構載入完畢"。
所以要防止上面問題的出現,統一做非同步處理,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼function onReady(fn) { var readyState = document.readyState; if (readyState ==="interactive" || readyState === "complete") { setTimeout(fn, 0); } else { window.addEventListener("DOMContentLoaded", fn); } } onReady(function () { console.log("DOM結構載入完畢"); }); console.log("開始輸出:");
上面程式碼通過setTimeout(fn, 0)方式巧妙解決所存在的問題。
相關文章
- 找0的個數
- setTimeout(fn, 0) // it works - JavaScript 事件迴圈 動畫演示JavaScript事件動畫
- 研究人員披露第二個 Steam 0day
- JS forEach()第二個引數JS
- mavn 執行 junit 單元測試的結果為 Tests run: 0, Failures: 0, Errors: 0, Skipped: 0AIError
- Java斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。Java
- vBulletin rce 0day分析
- 為什麼程式要從0開始計數
- SQL中除數為0處理情況演示SQL
- 2022-07-16:以下go語言程式碼輸出什麼?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0Go
- [20180920]0x0d0xa.txt
- 硬吃一個P0故障,「線上業務」應該如何調優HBase引數?
- 從0開始fastjson漏洞分析ASTJSON
- PPO演算法動作機率出現[0,0,0,0,0,1]的問題演算法
- JavaScript中的+0與-0JavaScript
- JS神奇的或0(|0)JS
- 從0開始學雜項 第二期:隱寫分析(1) 直接附加
- SAP ALV小數點後面如果為0不顯示
- antd ProTable 設定padding為0padding
- 求0~100000的所有水仙花數——思路分析+原始碼原始碼
- 將第一個 sql 語句中的結果作為第二個 sql 的引數值SQL
- c語言輸出100!的數值中的0的個數C語言
- Hacking Team系列 Flash 0Day分析
- Hacking Team 新 Flash 0day分析
- WinRAR(5.21)-0day漏洞-始末分析
- 從0開始fastjson漏洞分析2ASTJSON
- 0
- strcmp()函式,如果兩個字串引數相同,該函式就返回0,否則返回非零值函式字串
- mysql 字串和數字比,字串會隱式轉換為數字0MySql字串
- ent0 en0 et0 專題總結
- [20210708]find -mtime +0 0 -0時間問題補充.txt
- 【引數】REMOTE_LOGIN_PASSWORDFILE引數三種取值及其行為特性分析REM
- 為什麼用「void 0」代替「undefined」Undefined
- Linux shell——列印不為0的行Linux
- 從0到1搭建自助分析平臺
- Http failure response 0 Unknown error 錯誤分析HTTPAIError
- 從0到1進行Spark history分析Spark
- mysql-小數點後面的0MySql