日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

前端每日一解 - setTimeout的执行顺序

發(fā)布時間:2024/1/18 HTML 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 前端每日一解 - setTimeout的执行顺序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先解釋一下主任務、微任務和宏任務的概念。

因為JS是單線程,代碼中所有同步任務(后面統(tǒng)一稱為主任務)都在主線程上執(zhí)行,形成一個執(zhí)行棧,棧是先進后出的。代碼跑起來以后會先執(zhí)行棧中的主任務直到所有任務執(zhí)行完畢;當遇到異步任務時,它會被單獨放到異步執(zhí)行隊列中去,這里的異步任務又分為宏任務和微任務,有一個宏任務隊列和一個微任務隊列,隊列是先進先出的

在異步任務中,微任務優(yōu)于宏任務執(zhí)行,當主任務執(zhí)行完畢后先去查看微任務隊列中是否有東西,有則主線程讀取微任務隊列中的所有內(nèi)容按順序執(zhí)行完畢(這個過程中遇到了異步任務也是要放到兩個異步隊列的末尾的,后面主線程中內(nèi)容執(zhí)行完畢后又會去讀取,所以可能產(chǎn)生事件循環(huán)Event Loop,這是前端必須了解的一個概念)。當主任務棧和微任務隊列中沒有內(nèi)容了,主線程才會讀取宏任務隊列中的所有內(nèi)容按順序執(zhí)行完畢。

所以,執(zhí)行順序:主任務?> 微任務?> 宏任務?


而setTimeout屬于異步任務中的宏任務。當代碼按順序讀到setTimeout函數(shù)時,會執(zhí)行它開始計時,計時完成后把setTimeout函數(shù)里面的內(nèi)容放入宏任務隊列中等待后續(xù)被主線程讀取。

  • 如果setTimeout的時間設置非常大,當主任務和微任務中的內(nèi)容都執(zhí)行完畢時間都還沒結(jié)束,那么會等到時間到了再進入宏任務隊列并被主線程讀取
  • 如果setTimeout的時間設置比較小,在主任務和微任務中的內(nèi)容執(zhí)行完畢之前就結(jié)束了,那么它在時間到了以后就會被加入宏任務隊列,并且當主任務和微任務內(nèi)容讀取完畢以后會立刻調(diào)用宏任務中加入的setTimeout函數(shù)里面的內(nèi)容只有同步任務執(zhí)行完了才會去執(zhí)行異步任務,哪怕異步任務已經(jīng)到時間了。
  • 在同一環(huán)境中有多個setTimeout函數(shù)時(都在主任務或者都在微任務中),setTimeout函數(shù)中內(nèi)容被放入宏任務隊列的順序與代碼書寫的順序無關(guān),而是與計時器時間設定的長短有關(guān),時間越長則越后加入隊列,也越后被讀取執(zhí)行。
  • 總結(jié)

    以上是生活随笔為你收集整理的前端每日一解 - setTimeout的执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。