摘要:我們都知道在中是異步執(zhí)行機(jī)制的像這樣如果在這條語(yǔ)句后面還有很多的同步任務(wù),它必須要等這些同步任務(wù)完成才會(huì)執(zhí)行里面的內(nèi)容不好意思,我要等循環(huán)的同步任務(wù)完成才能執(zhí)行這里的任務(wù)完成了,才會(huì)執(zhí)行的內(nèi)容那么我所發(fā)現(xiàn)的這個(gè)問(wèn)題如下如代碼所示在中插入兩個(gè)
我們都知道在JS中setTimeout是異步執(zhí)行機(jī)制的 像setTimeout(function(){},0)這樣
如果在這條語(yǔ)句后面還有很多的同步任務(wù),
它必須要等這些同步任務(wù)完成才會(huì)執(zhí)行setTimeout里面的內(nèi)容
setTimeout(function(){ 不好意思,我要等f(wàn)or循環(huán)的同步任務(wù)完成才能執(zhí)行 },0) for(var i = 0; i < 99999999999; i++){ 這里的任務(wù)完成了,才會(huì)執(zhí)行setTimeout的內(nèi)容 }
那么我所發(fā)現(xiàn)的這個(gè)問(wèn)題如下:
如代碼所示:在body中插入兩個(gè)script標(biāo)簽
這里所用的測(cè)試字符串是中文
這里需要做3個(gè)實(shí)驗(yàn),分為A、B、C
實(shí)驗(yàn)A:用比較短的字符串,(有5個(gè)中文字體)來(lái)測(cè)試,執(zhí)行的彈窗結(jié)果是:
fir-script -> sec-script -> "測(cè)試字符串" -> setTime
實(shí)驗(yàn)B:用較長(zhǎng)的字符串,(有45000個(gè)中文字體)來(lái)測(cè)試,結(jié)果發(fā)現(xiàn)了變化 執(zhí)行的彈窗結(jié)果是:
fir-script ->setTime -> sec-script -> "測(cè)試字符串"
實(shí)驗(yàn)C:減少部分字符串,(有43000個(gè)中文字體)來(lái)測(cè)試,執(zhí)行的彈窗結(jié)果是:
fir-script -> sec-script -> "測(cè)試字符串" -> setTime
在其他條件沒(méi)有變化的情況下(注意:三次測(cè)試setTiemout的時(shí)間都是0)
程序執(zhí)行的順序似乎和字符串的長(zhǎng)度有關(guān)
(那其實(shí)可以說(shuō)是和script里面的內(nèi)容大小有關(guān),那也可以進(jìn)一步理解為和解析script內(nèi)容的時(shí)間有關(guān))
為了驗(yàn)證上述結(jié)論(執(zhí)行順序和解析script內(nèi)容的時(shí)間有關(guān))
在實(shí)驗(yàn)B的基礎(chǔ)上,對(duì)setTiemout的時(shí)間進(jìn)行更改,其他保持不變
如B(5)為5ms后執(zhí)行,即setTimeout(()=>{alert("setTime");},5);
下面我們看一下結(jié)果:
B(0): fir-script -> setTime -> sec-script -> "測(cè)試字符串"
B(5): fir-script -> setTime -> sec-script -> "測(cè)試字符串"
B(10): fir-script ->sec-script -> "測(cè)試字符串" -> setTime
B(15): fir-script -> sec-script ->"測(cè)試字符串" -> setTime
從上面幾個(gè)實(shí)驗(yàn)我們可以在側(cè)面看出一個(gè)現(xiàn)象
setTime 不會(huì)出現(xiàn)在 sec-script 和 "測(cè)試字符串" 之間,
這也反映了JS是單線程執(zhí)行的,而且在同步任務(wù)里,不受其他script標(biāo)簽的影響
通過(guò)這個(gè)案例,發(fā)現(xiàn)了一些問(wèn)題,總結(jié)如下:
如有其他外部腳本(即使這些腳本都是同步任務(wù)),像setTiemout這些異步任務(wù),不會(huì)等待所有同步任務(wù)執(zhí)行完成
只有在同一個(gè)script標(biāo)簽里,異步任務(wù)要等待該標(biāo)簽的所有同步任務(wù)完成才會(huì)執(zhí)行
因?yàn)樾枰ソ馕瞿_本,而解析腳本與執(zhí)行另外的腳本不沖突
最后的最后,如果你在嘗試過(guò)程中發(fā)現(xiàn)與本文的結(jié)果不相同,請(qǐng)把測(cè)試用的案例”加強(qiáng)“,如把字符串加到10W,這是因?yàn)閟etTimeout的不確定性
歡迎大家一起來(lái)探討
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100565.html
摘要:一篇文章和一道面試題最近,有篇名為張圖幫你一步步看清和的執(zhí)行順序的文章引起了我的關(guān)注。作者用一道年今日頭條的前端面試題為引子,分步講解了最終結(jié)果的執(zhí)行原因。從字面意思理解,讓我們等等。當(dāng)前的最新版本,在這里的執(zhí)行順序上,的確存在有問(wèn)題。 一篇文章和一道面試題 最近,有篇名為 《8張圖幫你一步步看清 async/await 和 promise 的執(zhí)行順序》 的文章引起了我的關(guān)注。 作者用...
摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問(wèn)題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。 想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問(wèn)題在我腦...
摘要:如果你要問(wèn)他和誰(shuí)當(dāng)進(jìn)去的快,要從下面兩個(gè)方面考慮結(jié)束時(shí)。至于什么,查了很多的資料,了解到一個(gè)瀏覽器環(huán)境只能有一個(gè)事件循環(huán),而一個(gè)事件循環(huán)可以有多個(gè)任務(wù)隊(duì)列。 ====據(jù)說(shuō)這是今日頭條去年的一道筆試題,主要考察的是setTimeout async promise執(zhí)行順序 ~先雙手奉上這道題目~ async function async1() { consol...
摘要:進(jìn)一步最終定位發(fā)現(xiàn)如果為的時(shí)候,效率驟降,如果為合法的字符串的時(shí)候,效率是正常值。每次執(zhí)行該子句都會(huì)發(fā)生這種情況,將捕獲的異常對(duì)象分配給一個(gè)變量。盡可能將它們與其他代碼隔離,以免影響其性能。關(guān)鍵代碼拆解成如下圖所示(無(wú)關(guān)部分已省略):起初我認(rèn)為可能是這個(gè) getRowDataItemNumberFormat 函數(shù)里面某些方法執(zhí)行太慢,從 formatData.replace 到 unesca...
摘要:打開一個(gè)網(wǎng)頁(yè),看到服務(wù)器返回給客戶端瀏覽器的各種文件類型圖片構(gòu)建瀏覽器會(huì)遵守一套步驟將文件轉(zhuǎn)換為樹。因?yàn)闉g覽器有渲染線程與引擎線程,為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,這兩個(gè)線程是互斥的關(guān)系。 1. 瀏覽器架構(gòu) 用戶界面 主進(jìn)程 內(nèi)核 渲染引擎 JS 引擎 執(zhí)行棧 事件觸發(fā)線程 消息隊(duì)列 微任務(wù) 宏任務(wù) 網(wǎng)絡(luò)異步線程 定時(shí)器線程 2. 從輸入 url 到頁(yè)面展示...
閱讀 1486·2021-09-28 09:44
閱讀 2562·2021-09-28 09:36
閱讀 1249·2021-09-08 09:35
閱讀 2010·2019-08-29 13:50
閱讀 850·2019-08-29 13:29
閱讀 1165·2019-08-29 13:15
閱讀 1757·2019-08-29 13:00
閱讀 3033·2019-08-26 16:16