前言
本文主要給大家介紹了關于setTimeout時間設置為0的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
1、開胃菜,setTimeout為何物
首先看一下w3school上面對于setTimeout的解釋
setTimeout(fn,millisec) 方法用于在指定的毫秒數后調用函數或計算表達式。
很簡單,setTimeout() 只執行 fn 一次,到底什么時候執行取決于第二個參數millisec設定的毫秒數,所以很多人習慣上稱之為延遲,無非就是延遲一段時間后再執行里面的代碼。
setTimeout(function(){ console.log('我是setTimeout');}, 1000);正常情況下,我是setTimeout 這句話并不會馬上輸出而是等1000毫秒以后會在瀏覽器的控制臺輸出。
2、主菜,js是單線程的
OK,看一個例子,這個例子的輸出結果是什么?
setTimeout(function(){ console.log(1);}, 0);console.log(2);console.log(3);出乎一些人的意料,得到的結果竟然是2、3、1。這似乎不按套路出牌啊,明明是等待了0毫秒也就是不等待直接輸出啊,為啥1卻在最后輸出了呢?
這就需要搞清楚一個很重要的概念:js是單線程的,單線程就意味著,所有任務需要排隊,前一個任務結束,才會執行后一個任務。如果前一個任務耗時很長,后一個任務就不得不一直等著。
其實很好理解,就像大家去超市買東西一樣,所有買東西的人都需要在收銀臺排隊結賬,正常情況下每個收銀臺同一時間只能為一位顧客結賬,這位顧客結賬完成才能為下一位顧客服務。
而瀏覽器的內核是多線程的,它們在內核制控下相互配合以保持同步,一個瀏覽器至少實現三個常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發線程。
javascript引擎是基于事件驅動單線程執行的,JS引擎一直等待著任務隊列中任務的到來,然后加以處理,瀏覽器無論什么時候都只有一個JS線程在運行JS程序。新聞熱點
疑難解答
圖片精選