javascript
JavaScript相关面试题:setTimeout的运行机制
文章目錄
- setTimeout簡介
- JavaScript 單線程
- setTimeout運行機制
setTimeout簡介
setTimeout()函數:用來指定某個函數或某段代碼在多少毫秒之后執行。它返回一個整數,表示定時器timer的編號,可以用來取消該定時器。
console.log(1); setTimeout(function () {console.log(2); }, 0); console.log(3)//1 3 2無論setTimeout的執行時間是0還是1000,結果都是先輸出3后輸出2,這就是面試官常常考查的js運行機制的問題
JavaScript 單線程
JavasScript引擎是基于事件驅動和單線程執行的,JS引擎一直等待著任務隊列中任務的到來,然后加以處理,瀏覽器無論什么時候都只有一個JS線程在運行程序,即主線程。那么單線程的JavasScript是怎么實現“非阻塞執行”呢?是通過任務隊列。
所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。
單線程就意味著,所有任務需要排隊,前一個任務結束,才會執行后一個任務。如果前一個任務耗時很長,后一個任務就不得不一直等著。但是如果有些任務很慢時(比如Ajax操作從網絡讀取數據),我還是要等結果在執行后一個任務嗎?于是,有了一種異步任務。
同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務;而異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有主線程執行完畢,主線程去通知"任務隊列",某個異步任務可以執行了,該任務才會進入主線程執行。
★所有同步任務都在主線程上執行,形成一個執行棧(Call Stack)
★主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件
★一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。
★主線程不斷重復上面的第三步
setTimeout運行機制
setTimeout 和 setInterval的運行機制,其實就是將指定的代碼移出本次執行,等到下一輪 Event Loop 時,再檢查是否到了指定時間。如果到了,就執行對應的代碼;如果不到,就等到再下一輪 Event Loop 時重新判斷。
這意味著,setTimeout指定的代碼,必須等到本次執行的所有同步代碼都執行完,才會執行。
總結
以上是生活随笔為你收集整理的JavaScript相关面试题:setTimeout的运行机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP 理解期末清帐和重分类
- 下一篇: 大型网站技术架构设计