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)方式巧妙解決所存在的問題。
相關文章
- c# {0}引數值C#
- JavaScript replace()第二個引數為函式時的引數JavaScript函式
- 【 js 基礎 】 setTimeout(fn, 0) 的作用JS
- setTimeout()設定延遲時間為0毫秒的作用
- 搞定request.getRemoteAddr()獲取的值為0:0:0:0:0:0:0:1REM
- cxf webservice 生成wsdl方法引數名稱為arg0問題Web
- JavaScript 個位數前面加0JavaScript
- setTimeout(fn, 0) // it works - JavaScript 事件迴圈 動畫演示JavaScript事件動畫
- setTimeout()方法傳遞超過兩個引數介紹
- JS forEach()第二個引數JS
- setTimeout()函式第一個引數帶引號報錯原因介紹函式
- Python中func(*args, **kwargs)的引數問題Python
- 執行計劃中Row 數量為0
- Java斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。Java
- mavn 執行 junit 單元測試的結果為 Tests run: 0, Failures: 0, Errors: 0, Skipped: 0AIError
- 為什麼程式要從0開始計數
- SQL中除數為0處理情況演示SQL
- Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticateServerlocalhost
- HttpServletRequest呼叫getRemoteAddr獲取IP返回0:0:0:0:0:0:0:1的問題HTTPServletREM
- vBulletin rce 0day分析
- 將第一個 sql 語句中的結果作為第二個 sql 的引數值SQL
- 數學詞彙總結0
- 對引數FAST_START_MTTR_TARGET = 0 的誤解及設定AST
- mysql 字串和數字比,字串會隱式轉換為數字0MySql字串
- 2022-07-16:以下go語言程式碼輸出什麼?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0Go
- 從0開始學雜項 第二期:隱寫分析(1) 直接附加
- PPO演算法動作機率出現[0,0,0,0,0,1]的問題演算法
- strcmp()函式,如果兩個字串引數相同,該函式就返回0,否則返回非零值函式字串
- SAP ALV小數點後面如果為0不顯示
- jQuery()方法第二個引數的作用簡單介紹jQuery
- JavaScript中的+0與-0JavaScript
- JS神奇的或0(|0)JS
- 【引數】REMOTE_LOGIN_PASSWORDFILE引數三種取值及其行為特性分析REM
- 0~9十個數,每個數只能使用一次,組成兩個三位數相加和為四位數的演算法演算法
- WinRAR(5.21)-0day漏洞-始末分析
- 從0開始fastjson漏洞分析ASTJSON
- c3p0原始碼分析原始碼
- gh0st的IOCP模型分析模型